发现一个好东西Protostuff, 据说可以不写proto文件来把对象序列化成二进制格式,用了一下果然好使。
public class Protostuff {
@SuppressWarnings("unchecked")
public static <T> byte[] serial(T obj) {
Class<T> clazz = (Class<T>) obj.getClass();
// RuntimeSchema会缓存类信息,不用自己实现缓存了,爽
Schema<T> schema = RuntimeSchema.getSchema(clazz);
// 缓存buff, 不够会自动增长
LinkedBuffer buffer = LinkedBuffer.allocate(1024);
// 序列化成protobuf的二进制数据
byte[] data = null;
try {
data = ProtobufIOUtil.toByteArray(obj, schema, buffer);
} finally {
buffer.clear();
}
return data;
}
public static <T> T deserial(byte[] data, Class<T> clazz) {
Schema<T> schema = RuntimeSchema.getSchema(clazz);
T message = schema.newMessage();
ProtobufIOUtil.mergeFrom(data, message, schema);
return message;
}
}
测试对象可以使用注解指定字段序号,排除字段等(另外还有Rpc,Request和Response等注解指定rpc服务):
public class Person{ @Tag(1) public int id; @Tag(2) public String name; @Exclude public String email; @Tag(3) public int age; @Tag(4) public Student student; @Tag(5) public List<Student> list = new ArrayList<Student>(); @Tag(6) public Map<String, Student> map = new HashMap<String, Student>(); @Tag(7) public String s; } public class Student { @Tag(1) private String email; @Tag(2) private int age; public Student(){ } public Student(String email, int age) { super(); this.email = email; this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
测试:
public static void main(String[] args)throws Exception { Person person1 = new Person(); person1.id = 10086; person1.name = "ken"; person1.email = "ken@iamcoding.com"; person1.age = 10; person1.student = new Student("yuan@aliyun.com", 20); person1.list.add(new Student("yuan2@aliyun.com", 30)); for(int i=0; i<2000; i++){ person1.list.add(new Student("yuan3@aliyun.com", 40)); } person1.map.put("1", new Student("yuan4@aliyun.com", 400)); person1.map.put("2", new Student("yuan5@aliyun.com", 500)); // 序列化成protobuf的二进制数据 byte[] data = Protostuff.serial(person1); Files.write(Paths.get("/data/Persion.data"), data); // 反序列化 Person person2 = Protostuff.deserial(Files.readAllBytes(Paths.get("/data/Persion.data")), Person.class); System.out.println(person2.id); System.out.println(person2.name); System.out.println(person2.email); System.out.println(person2.age); System.out.println(person2.student.getAge()); System.out.println(person2.student.getEmail()); System.out.println("***" + person2.list.size()); System.out.println("***" + person2.list.get(0).getAge()); System.out.println("***" + person2.list.get(0).getEmail()); System.out.println("===" + person2.map.get("1").getAge()); System.out.println("===" + person2.map.get("1").getEmail()); }
Protostuff使用还是比较简单的,但是没有发现序列化之前的回调方法注解和反序列化后的回调方法注解,不过这好实现不算问题。
另外对象增加字段后,仍然能够反序列化老数据,这个做的也不错。
Protostuff只能在JAVA中使用,完全可以替代FST,msgpack, 等一些二进制协议,用来将对象存储到缓存或者db中。
不过对于通信协议来说 写proto文件会更清晰, 所以通信使用protobuf更好!
相关推荐
这个“protostuff序列化包”包含了protostuff库的源代码,使得开发者可以直接将源码集成到自己的项目中,避免了额外的依赖管理和版本冲突问题。 Protostuff序列化库主要包含以下组件和功能: 1. **序列化框架**: ...
Protostuff序列化和反序列化的使用说明 序列化和反序列化是数据交换和存储中的重要步骤,Protostuff是一个基于protobuf的序列化和反序列化库,提供了高效、灵活和可扩展的序列化和反序列化解决方案。本文将对...
标题“protostuff序列化实例”指的是使用Protostuff库进行数据序列化和反序列化的实际操作示例。这通常涉及到创建一个数据模型(通常是POJO,Plain Old Java Object),定义对象的字段和结构,然后使用Protostuff的...
标题提到的"protostuff序列化工具"是指使用Protostuff库进行数据序列化的工具。 Protostuff的优点在于它不需要预编译的protobuf消息定义,而是通过反射机制动态解析类的字段来实现序列化和反序列化。这使得在项目中...
- 引入Protostuff库,使用`io.protostuff.Schema`和`io.protostuff.Output`进行序列化,使用`io.protostuff.Input`进行反序列化。 - 调用相应的序列化和反序列化方法,将对象转换为字节流,或从字节流恢复对象。 ...
这三个jar包——`fastjson-1.2.35.jar`、`gson-2.8.1.jar`和`protostuff`,分别包含了对应库的实现,可以在Java项目中引入这些库来实现高效的序列化和反序列化功能。记得在使用前,先根据项目的需求和兼容性评估哪个...
Protostuff是一个强大的序列化库,它为Java和C#开发者提供了一种高效、灵活的方式来序列化和反序列化对象。这个库的核心功能是将Java或C#的对象转换成二进制格式,以便于存储、传输或者与其他系统进行数据交换。 ...
7. **元数据支持**:Protostuff 支持元数据的序列化,使得序列化的数据包含了关于对象结构的信息,方便反序列化时重建对象。 8. **无侵入性**:Protostuff 不需要修改现有类或添加特定注解,使得它可以与现有的代码...
Protostuff是一个轻量级、高性能的序列化框架,它用于序列化和反序列化Java对象到各种格式,如二进制、XML、JSON等。这个压缩包包含了Protostuff运行所需的所有依赖JAR文件,使得开发者能够在项目中便捷地集成和使用...
3. **Fastjson**:阿里巴巴开源的JSON库,它也可以用于序列化和反序列化Java对象,性能较好,且支持复杂的Java类型。 4. **protostuff**:基于Protocol Buffers的序列化库,它允许序列化到各种格式,包括二进制和...
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
4. Protostuff序列化 Protostuff是一个高性能、轻量级的序列化框架,支持多种格式(包括二进制和JSON)。它的优势在于速度快、内存消耗低,同时提供了易于使用的API。通过Protostuff,可以定义一个数据模型并将其...
默认Redis作为缓存,并使用ProtoStuff序列化/反序列化对象 统一的异常处理和优雅的接口输出 RESTful接口风格 可持续集成其他所需的服务 【代码结构】 ─common 公共库 │ ├─data 数据访问处理 │ ├─exception ...
总结来说,基于Protostuff的Netty编解码器是通过结合Protostuff的序列化和反序列化能力以及Netty的编解码器框架来实现的。它允许我们将复杂的Java对象安全地转换为网络友好的字节流,并在接收端恢复原状。这种机制...
【标题】"protostuff-runtime-md-1.0.4.zip" 提供的是 Protostuff 运行时库的一个版本,这是一个轻量级且高效的序列化框架,它能够将 Java 对象序列化为二进制格式,同时也支持反序列化。Protostuff 广泛应用于数据...
Protobuf是Google开源的高效,跨平台的序列化工具,而protostuff是一个基于pro_protostuff-runtime-bruce-1.1.3
序列化与反序列化使用Protostuff实现高效的序列化和反序列化,确保数据传输的效率和可靠性。 多版本支持支持服务版本管理,允许同一接口的不同版本共存,便于服务的平滑升级。 安装使用步骤 1. 定义RPC接口 ...
接着,消费者使用Netty建立与服务提供者的连接,并发送经过Protostuff序列化的请求数据。服务端接收到请求后,反序列化数据,执行对应的业务逻辑,然后将结果序列化并返回给客户端。 为了保证通信的可靠性和性能,...
Redis缓存(ProtoStuff序列化) Redis Sentinel主从高可用方案 Redis Cluster集群高可用方案 Druid(数据源配置 sql防注入 sql性能监控) 前后端分离(Html替代Jsp) Nginx静态加载、负载均衡 基于keepalived的nginx...