按官方的说法,protostuff是一个序列化库,提供了向后兼容和验证的内置支持。
而我们用protostuff的原因,也就是他真正牛逼的地方在于,他可以把一个POJO序列化为多种格式:
- protobuf
- protostuff (native)
- graph (protostuff with support for cyclic references. See Serializing Object Graphs)
- json
- smile (binary json useable from the protostuff-json module)
- xml
- yaml (serialization only)
- kvp (binary uwsgi header)
只要一个POJO+protostuff就能转换为这么多格式!用过protobuf的应该知道,谷歌PB官方是不支持处理POJO的,每个语言平台都只能用protoc生成的代码来进行序列化反序列化,而protoc生成的代码非常复杂,是整合了序列化逻辑的一个类,这个类除了用来进行protobuf格式的序列化,无法用作其他用途了。而POJO我们都爱,所以我们选择了使用protobuf来把POJO序列化为protobuf格式的数据。
例子
写一个用protostuff进行protobuf格式的序列化的例子:
引入protostuff的依赖:
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.3.5</version>
</dependency>
|
新建一个用于序列化的POJO:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
|
编写序列化和反序列化例子:
Person p = new Person("mushan",20);
LinkedBuffer buffer = LinkedBuffer.allocate();
Schema<Person> schema = RuntimeSchema.getSchema(Person.class);
byte[] protobuf = ProtobufIOUtil.toByteArray(p, schema, buffer);
Person person = schema.newMessage();
ProtobufIOUtil.mergeFrom(protobuf,person,schema);
System.out.println(person);
|
输出:Person{name='mushan', age='20'}
。说明反序列化成功。
定义字段顺序
使用过protobuf的一定知道,protobuf序列化反序列化不是依赖名称的,而是依赖字段的位置,也被成为字段的tag。默认情况下,protostuff使用字段的定义顺序作为字段的tag。但是需要注意的是,这个特性不是每种JVM都支持的。sun体系的JVM都没问题,但是比如像安卓的dalvik虚拟机,在反射的时候,获取的字段顺序就不一定是定义顺序了,所以有时候我们需要手动指定字段的tag。这时我们可以使用protostuff提供的Tag注解:
public final class Bar
{
@Tag(8)
int baz;
}
|
protostuff生成的protobuf格式的数据能被protobuf自己生成的类解析么?
能。我只测试了简单类型。对于复杂类型会不会出现不兼容还不清楚,同时对于版本的兼容性也还不太清楚。
将POJO生成proto文件
这个需要使用webbynet/protostuff-runtime-proto: Protostuff Runtime Proto Files Generator这个项目。
使用非常简单,通过RuntimeSchema得到schema后直接就可以生成proto:
String content = Generators.newProtoGenerator(schema).generate();
System.out.println(content);
|
参考资料
- protostuff/protostuff: Java serialization library, proto compiler, code generator
- protostuff
- Protostuff详解 - chszs的专栏 - 博客频道 - CSDN.NET
http://mushanshitiancai.github.io/2016/09/02/java/%E4%BD%BF%E7%94%A8protostuff%E8%BF%9B%E8%A1%8C%E5%BA%8F%E5%88%97%E5%8C%96/
https://my.oschina.net/OutOfMemory/blog/800226
相关推荐
提供prostuff序列化源码,直接将需要的源码拷进项目即可。
包括了序列化和反序列化功能,将对应包拷入工程即可使用
支持jdk1.6以上版本,protostuff源码,拷入项目即可使用
今天小编就为大家分享一篇关于Protostuff序列化和反序列化的使用说明,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
protostuff fastjson gson 高性能序列化jar包
protostuff 是一个支持各种格式的一个序列化Java类库,包括 JSON、XML、YAML等格式。示例代码:public class UserSchema implements Schema { public boolean isInitialized(User user) { return...
所依赖的所有jar包; threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: com/dyuproject/protostuff/MapSchema$MessageFactory] with root cause
protostuff 是一个支持各种格式的一个序列化Java类库,包括 JSON、XML、YAML等格式
Spring + Netty + Protostuff + ZooKeeper 实现了一个轻量级 RPC 框架,使用 Spring 提供依赖注入与参数配置,使用 Netty 实现 NIO 方式的数据传输,使用 Protostuff 实现对象序列化,使用 ZooKeeper 实现服务注册与...
可以对数据进行序列化和反序列化提高传输的效率,实现款平台传输。比protobuf使用简单
SNRPC -- 一个简单的 netty RPC 框架,序列化器使用 protostuff-1.07,nio 使用 netty-3.2.1。 ##如何使用例如1、服务器类; 接口和实现者 // 定义一个接口: public interface SnRpcInterface { public String ...
基于SpringBoot搭建 Redis操作 包括String、Hash、List、Set、ZSet 使用protostuff序列化和反序列化 注释齐全欢迎大家下载使用
JedisSerialization实现利用Jedis向Redis中写入和得到Java对象的几种序列化工具:JDK、XML、JSON、Protostuff
Spring:它是最强大的依赖注入框架,也...Protostuff:它基于 Protobuf 序列化框架,面向 POJO,无需编写 .proto 文件。 ZooKeeper:提供服务注册与发现功能,开发分布式系统的必备选择,同时它也具备天生的集群能力。
默认Redis作为缓存,并使用ProtoStuff序列化/反序列化对象 统一的异常处理和优雅的接口输出 RESTful接口风格 可持续集成其他所需的服务 【代码结构】 ─common 公共库 │ ├─data 数据访问处理 │ ├─exception ...
1、使用protostuff序列化(.proto文件编写恶心,与Protocol Buffer性能几乎接近) 2、使用Netty进行通讯(同节点RPC不走网络,直接入收件箱队列); 3、路由策略:随机路由、指定Key路由、资源Id路由、强制路由 4、...
Redis缓存(ProtoStuff序列化) Redis Sentinel主从高可用方案 Redis Cluster集群高可用方案 Druid(数据源配置 sql防注入 sql性能监控) 前后端分离(Html替代Jsp) Nginx静态加载、负载均衡 基于keepalived的nginx...
支持基于Protostuff序列化框架实现 支持基于XSON序列化框架实现 提供基于Feign的RestService动态创建 提供基于easyjson的编码器,解码器 集成负载均衡功能 提供多种param Expander 筛选器: 访问日志过滤器 编码...
java实现的RPC框架,使用技术:JDK动态代理、Socket通信(NIO方式)、反射、注解、Protostuff序列化、zookeeper、Spring
一个Java序列化库,内置支持向前和向后兼容性(模式演变)和验证。 高效,速度和内存 灵活,支持可插拔格式 用例 RPC中的消息传递层 数据存储或缓存中的存储格式 有关更多信息,请访问 Maven 对于核心格式...