按官方的说法,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
相关推荐
这个“protostuff序列化包”包含了protostuff库的源代码,使得开发者可以直接将源码集成到自己的项目中,避免了额外的依赖管理和版本冲突问题。 Protostuff序列化库主要包含以下组件和功能: 1. **序列化框架**: ...
- 引入Protostuff库,使用`io.protostuff.Schema`和`io.protostuff.Output`进行序列化,使用`io.protostuff.Input`进行反序列化。 - 调用相应的序列化和反序列化方法,将对象转换为字节流,或从字节流恢复对象。 ...
标题“protostuff序列化实例”指的是使用Protostuff库进行数据序列化和反序列化的实际操作示例。这通常涉及到创建一个数据模型(通常是POJO,Plain Old Java Object),定义对象的字段和结构,然后使用Protostuff的...
本文将对Protostuff序列化和反序列化的使用进行详细的说明。 首先,Protostuff相比于Google原生的protobuf有着明显的优势。protobuf需要编写.proto文件,然后编译.proto文件,生成对应的.java文件,这个过程较为...
- 项目的源代码:展示了如何在Java和C#中使用Protostuff进行序列化和反序列化。 - 示例代码:演示如何与Netty和MySQL配合使用。 - 文档:可能包括API参考和使用教程,帮助开发者理解和使用这个库。 - 库文件:包含...
将这些JAR文件添加到项目的类路径中,即可开始使用Protostuff进行序列化和反序列化操作。为了更好地利用Protostuff,开发者需要了解如何定义数据模型,选择合适的序列化策略,并根据需求选择是否使用代码生成器。 ...
标题提到的"protostuff序列化工具"是指使用Protostuff库进行数据序列化的工具。 Protostuff的优点在于它不需要预编译的protobuf消息定义,而是通过反射机制动态解析类的字段来实现序列化和反序列化。这使得在项目中...
`protostuff`、`fastjson`和`gson`就是三个流行的Java序列化库,它们各自具有独特的特性和优势。 首先,让我们详细了解一下这三个库: 1. **protostuff**: - Protostuff是一个非常快速且灵活的序列化框架,它...
10. **灵活性**:Protostuff 支持动态模式,对于那些无法预知结构的数据,例如来自第三方的服务,可以动态地进行序列化和反序列化。 通过研究 Protostuff 的源码,开发者可以深入理解其实现原理,学习如何优化序列...
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的Netty编解码器是通过结合Protostuff的序列化和反序列化能力以及Netty的编解码器框架来实现的。它允许我们将复杂的Java对象安全地转换为网络友好的字节流,并在接收端恢复原状。这种机制...
4. **protostuff**:基于Protocol Buffers的序列化库,它允许序列化到各种格式,包括二进制和JSON,性能优秀且灵活。 5. **Kryo**:一个高性能的Java序列化库,特别适合大数据和计算领域,但需要预先注册所有序列化...
Spring + Netty + Protostuff + ZooKeeper 实现了一个轻量级 RPC 框架,使用 Spring 提供依赖注入与参数配置,使用 Netty 实现 NIO 方式的数据传输,使用 Protostuff 实现对象序列化,使用 ZooKeeper 实现服务注册与...
Protobuf是Google开源的高效,跨平台的序列化工具,而protostuff是一个基于pro_protostuff-runtime-bruce-1.1.3
通过查看这些源代码,我们可以深入学习项目的具体实现,包括如何利用Netty进行网络通信,如何使用Protostuff进行序列化,以及如何实现服务发现和调用等核心功能。 以上是对标题和描述中提及的关键技术点的详细解析...
4. Protostuff序列化 Protostuff是一个高性能、轻量级的序列化框架,支持多种格式(包括二进制和JSON)。它的优势在于速度快、内存消耗低,同时提供了易于使用的API。通过Protostuff,可以定义一个数据模型并将其...
【标题】"protostuff-runtime-md-1.0.4.zip" 提供的是 Protostuff 运行时库的一个版本,这是一个轻量级且高效的序列化框架,它能够将 Java 对象序列化为二进制格式,同时也支持反序列化。Protostuff 广泛应用于数据...
SNRPC -- 一个简单的 netty RPC 框架,序列化器使用 protostuff-1.07,nio 使用 netty-3.2.1。 ##如何使用例如1、服务器类; 接口和实现者 // 定义一个接口: public interface SnRpcInterface { public String ...
// 使用protostuff序列化 ProtostuffSerializer serializer = new ProtostuffSerializer(); template.setValueSerializer(serializer); template.setKeySerializer(new StringRedisSerializer()); template....