在java中,序列化是经常需要使用的,比如对象在网络中传输,那么就必须要序列化后进行传输。而java自带的序列化使用起来虽然方便,但是它序列化后占的体积大,而且不能跨语言,因此在涉及到序列化的时候必然要找到一款高效的序列化框架。在网上查找了一下,发现protostuff使用方便,而且性能比较高,本篇博客简单记录一下ptotostuff如何实现一个序列化和反序列化。
一、需求
1、有一个用户类(Person)和一个地址类(Address),一个人有多个地址
2、person中有部分字段不需要序列化
|- 使用transient修饰即可不进行序列化
3、当对地址单独序列化时,需要定制化序列化,即有用户判断在什么情况下才可以序列化。(比如:当某个字段不可为空时才可以进行序列化)
|- 此种情况可以通过自定义Schema进行实现
4、如果后期序列化的类中新增了字段或删除了字段如何处理,参考 这篇文章, 此处不做处理。
二、实现
1、引入pom文件
<dependencyManagement> <dependencies> <dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-bom</artifactId> <version>1.4.4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-api</artifactId> </dependency> <dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-core</artifactId> </dependency> <dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency> </dependencies>
注意:主要是引入protostuff-core和protostuff-runtime这2个依赖
2、定义Address类
@Data @Builder public class Address { private String address; private String phone; }
3、自定义Address的Schema,用于定制化开发,此处简单实现,当address=null时不可进行序列化
/** * 自定义Address的Schema,主要是用于定制化开发 * @描述 * @作者 huan * @时间 2017年12月11日 - 下午9:57:24 */ public class AddressSchema implements Schema<Address> { @Override public String getFieldName(int number) { String ret = ""; switch (number) { case 1: ret = "address"; break; case 2: ret = "phone"; default: break; } return ret; } @Override public int getFieldNumber(String name) { if ("address".equals(name)) { return 1; } else if ("phone".equals(name)) { return 2; } return 0; } @Override public boolean isInitialized(Address message) { if (null != message.getAddress()) { return true; } return false; } @Override public Address newMessage() { return Address.builder().build(); } @Override public String messageName() { return Address.class.getSimpleName(); } @Override public String messageFullName() { return Address.class.getName(); } @Override public Class<? super Address> typeClass() { return Address.class; } @Override public void mergeFrom(Input input, Address message) throws IOException { while (true) { int number = input.readFieldNumber(this); switch (number) { case 0: return; case 1: message.setAddress(input.readString()); break; case 2: message.setPhone(input.readString()); break; default: input.handleUnknownField(number, this); } } } @Override public void writeTo(Output output, Address message) throws IOException { if (message.getAddress() == null) { throw new UninitializedMessageException(message, this); } output.writeString(1, message.getAddress(), false); if (null != message.getPhone()) { output.writeString(2, message.getPhone(), false); } } }
注意:此处如果不了解,可以先了解一下protobuff,了解一下.proto文件的写法。
此处做了一个简单的判断,当address==null时,不可进行序列化
4、Person类的开发
@Data @Builder public class Person { private String name; private Integer age; private transient String password; private List<Address> address; }
注意: 1、Person类包含一个Address的列表
2、注意password字段前面有一个transient,这个表示不进行序列化
3、@Tag注解可以用于标记字段的顺序号,但是一个类中如果要用则建议都使用
4、上方是 官网 给出的一个警告,大致意思是:如果你想在一个非静态的内部类上使用@Tag注解,那么最好将这个非静态的内部类改成静态的内部类。
5、编写测试代码
6、查看结果
相关推荐
这个“protostuff序列化包”包含了protostuff库的源代码,使得开发者可以直接将源码集成到自己的项目中,避免了额外的依赖管理和版本冲突问题。 Protostuff序列化库主要包含以下组件和功能: 1. **序列化框架**: ...
标题“protostuff序列化实例”指的是使用Protostuff库进行数据序列化和反序列化的实际操作示例。这通常涉及到创建一个数据模型(通常是POJO,Plain Old Java Object),定义对象的字段和结构,然后使用Protostuff的...
Protostuff序列化和反序列化的使用说明 序列化和反序列化是数据交换和存储中的重要步骤,Protostuff是一个基于protobuf的序列化和反序列化库,提供了高效、灵活和可扩展的序列化和反序列化解决方案。本文将对...
标题提到的"protostuff序列化工具"是指使用Protostuff库进行数据序列化的工具。 Protostuff的优点在于它不需要预编译的protobuf消息定义,而是通过反射机制动态解析类的字段来实现序列化和反序列化。这使得在项目中...
默认Redis作为缓存,并使用ProtoStuff序列化/反序列化对象 统一的异常处理和优雅的接口输出 RESTful接口风格 可持续集成其他所需的服务 【代码结构】 ─common 公共库 │ ├─data 数据访问处理 │ ├─exception ...
Redis缓存(ProtoStuff序列化) Redis Sentinel主从高可用方案 Redis Cluster集群高可用方案 Druid(数据源配置 sql防注入 sql性能监控) 前后端分离(Html替代Jsp) Nginx静态加载、负载均衡 基于keepalived的nginx...
Protostuff作为一个轻量级的序列化库,提供高效的序列化和反序列化性能,同时保持代码简洁和易于使用。 2. ** Protostuff支持的数据格式** - **JSON (JavaScript Object Notation)**:一种轻量级的数据交换格式,...
`protostuff`、`fastjson`和`gson`就是三个流行的Java序列化库,它们各自具有独特的特性和优势。 首先,让我们详细了解一下这三个库: 1. **protostuff**: - Protostuff是一个非常快速且灵活的序列化框架,它...
简单后台管理系统 基于maven管理,整合最新spring mvc 4.3.3.RELEASE版整合了mybatis 3.4.1,涵盖了目前互联网web系统最流行的组件,log4j2日志、freemarker模板、protostuff序列化、fastjson、redis、spring-data-...
4. Protostuff序列化 Protostuff是一个高性能、轻量级的序列化框架,支持多种格式(包括二进制和JSON)。它的优势在于速度快、内存消耗低,同时提供了易于使用的API。通过Protostuff,可以定义一个数据模型并将其...
接着,消费者使用Netty建立与服务提供者的连接,并发送经过Protostuff序列化的请求数据。服务端接收到请求后,反序列化数据,执行对应的业务逻辑,然后将结果序列化并返回给客户端。 为了保证通信的可靠性和性能,...
Redis缓存(ProtoStuff序列化) Redis Sentinel主从高可用方案 Druid(数据源配置 sql防注入 sql性能监控) Dubbo+Zookeeper分布式服务框架 合理的分布式服务划分(common+api+service+web) 资源调度和治理中心(SOA)...
1、使用protostuff序列化(.proto文件编写恶心,与Protocol Buffer性能几乎接近) 2、使用Netty进行通讯(同节点RPC不走网络,直接入收件箱队列); 3、路由策略:随机路由、指定Key路由、资源Id路由、强制路由 4、...
Protostuff是一个强大的序列化库,它为Java和C#开发者提供了一种高效、灵活的方式来序列化和反序列化对象。这个库的核心功能是将Java或C#的对象转换成二进制格式,以便于存储、传输或者与其他系统进行数据交换。 ...
Protostuff是一个轻量级、高性能的序列化框架,它用于序列化和反序列化Java对象到各种格式,如二进制、XML、JSON等。这个压缩包包含了Protostuff运行所需的所有依赖JAR文件,使得开发者能够在项目中便捷地集成和使用...
7. **元数据支持**:Protostuff 支持元数据的序列化,使得序列化的数据包含了关于对象结构的信息,方便反序列化时重建对象。 8. **无侵入性**:Protostuff 不需要修改现有类或添加特定注解,使得它可以与现有的代码...
// 使用protostuff序列化 ProtostuffSerializer serializer = new ProtostuffSerializer(); template.setValueSerializer(serializer); template.setKeySerializer(new StringRedisSerializer()); template....
protostuff 是一个支持各种格式的一个序列化Java类库,包括 JSON、XML、YAML等格式。示例代码:public class UserSchema implements Schema { public boolean isInitialized(User user) { return...
总结以上,Java实现的RPC框架综合运用了JDK动态代理、NIO Socket通信、反射、注解、Protostuff序列化以及Zookeeper分布式协调服务,构建了一套高效、灵活的远程调用解决方案。通过理解这些核心技术,开发者可以更好...
所依赖的所有jar包; threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: com/dyuproject/protostuff/MapSchema$MessageFactory] with root cause