java自有的序列化功能, 性能不怎么好,生产的字节也也偏大, 而且多语言之间不能通用。就自己花了几天时间,开发出了一个自动化序列化java对象。
原理是通过放射获取对象的信息,然后通过模板生产静态序列化和反序列化代码。
这个项目的优点是:
1, 对要序列化的对象项目无侵入。
2, 可以自定制。因为序列化和反序列化代码是自动生产了,可以随便修改。
3, 保持pojo的干净型
项目目前只支持一些常用类型。对象间的引用还不支持。特别是循环引用
说下性能吧!
理论上应该是很高的(没使用任何反射和动态代理)。与avro进行了对比, 发现序列化时, 比avro略低, 但是反序列化又略高。哈哈,很奇怪呀
生产的二进制字节要比avro大,通过int变形压缩后, 相差变小。
最后说下,这个为什么要有这个做这个项目吧!
不管是thrift, avro, google buffer, 它们都是很好的序列化工具,当做独立模块使用都很好, 但是与项目结合起来的时候,就存在对象间的转化问题。而且在使用也存在一些小缺陷。
附件中为代码,运行
SerializedTest
可以看到代码的性能。
在优化性能方面, 发现:
stream < ByteBuffer < byte[] 性能依次变差。
但是本人坚持简洁开发,因此使用的还是stream。 代码开发简洁很多。 但是性能也变慢。 (如果改成byte数组, 序列化和反序列化都要比avro强)
请看样例:
MakerConfig config = new MakerConfig();
config.className("ldh.LdhUser");
String basePath = "E:\\project\\ldh\\avro-test\\StupidBear\\src\\test\\java"; //代码生成路径
Maker maker = new Maker(config, basePath);
maker.create();
以上代码是对ldh.LdhUser生成序列化类。
最后生成了: ldh.LdhUserSerialize //静态类
序列化: public static byte[] ldh.LdhUserSerialize.toBytes(LdhUser user);
反序列化:public static LdhUser ldh.LdhUserSerialize.toObject(byte[] bytes);
性能测试:
对象User, json格式: {"name": "test-100", "age": 100, "id": 1000, "createTime": 123232323232, "address":["address-0", "address-1", "address-2", "address-3"], "props":{"key-0":"value-0", "key-1":"value-1"....., "key-9":"value-9"}}
序列化的大小:
avro length: 204 (avro 序列化后的大小)
ldh length: 249 (自动生成后的大小)
simple length: 292 (硬编码)
自动序列化变大有以下几个原因:
1, 对象可以为空(avro不能为空), 每一个属性添加了一字节进行是否为空标识(这样就多增加了20个字节)。
序列化性能对比: (对对象User进行: 100, 1000, 5000, 10000, 100000 序列化
ldh time:1, avro time:1, simple time:0
ldh time:10, avro time:7, simple time:9
ldh time:67, avro time:42, simple time:33
ldh time:103, avro time:69, simple time:68
ldh time:990, avro time:701, simple time:716
反序列化性能对比:
ldh time:0, avro time:1, simple time:1
ldh time:5, avro time:8, simple time:4
ldh time:26, avro time:44, simple time:20
ldh time:51, avro time:100, simple time:44
ldh time:536, avro time:890, simple time:408
相关推荐
3. **防御策略**:提供指南或自动化脚本,帮助管理员禁用不必要的序列化,或者部署中间件来过滤不安全的输入。 4. **模拟攻击**:通过模拟真实攻击场景,帮助安全团队评估和增强安全响应能力。 了解Java反序列化...
Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...
Java对象序列化与反序列化是Java编程中重要的概念,主要应用于数据持久化、网络传输以及存储等场景。本文将详细解析这两个概念及其在实际应用中的实现方式。 **一、Java对象序列化** 1. **定义**: Java对象序列化...
Java的序列化与反序列化是Java开发中的一项重要技术,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。`Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,...
Java自动处理枚举类型的序列化,无需显式指定序列化策略。 **1.13 保护敏感信息** 在序列化过程中,可能需要处理包含敏感信息的对象。为此,Java提供了一些机制来保护这些信息,例如使用`transient`关键字来标识不...
Java序列化是Java平台中的一种标准机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络进行传输或者在某些时候恢复原来的对象状态。这一过程包括两个主要步骤:对象的序列化(将对象转换为字节流)和反...
1. **继承性**:如果一个类是可序列化的,那么它的所有子类也将自动成为可序列化的。然而,如果父类没有实现`Serializable`接口,那么只有子类中定义的字段会被序列化,而父类的字段不会。 2. **静态和transient...
当一个类被序列化时,JVM会自动计算该类的`serialVersionUID`,这个值基于类的结构,如字段类型和名称。如果在反序列化时,类的结构发生变化(比如添加、删除或修改了字段),但是`serialVersionUID`未更新,那么就...
【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...
- 实现此接口后,Java虚拟机就能够自动进行序列化和反序列化操作。 2. **序列化过程:** - 创建一个`java.io.ObjectOutputStream`实例。 - 使用`ObjectOutputStream`的`writeObject()`方法将对象写出到输出流中...
但是,XStream库能够自动处理这种情况,将关联的`Address`对象也序列化到XML中。 在这个实验中,学习了如何利用第三方库实现Java对象到XML的序列化。XStream库的使用简化了这个过程,使得我们可以方便地在Java对象...
当反序列化这个特殊对象时,它会自动执行命令并将结果发送给预设的地址。 #### 实战案例 假设我们有一个恶意的 `Payload` 类,其构造函数接受一个命令字符串作为参数。当这个对象被反序列化时,它将执行该命令并...
Java JAXB(Java Architecture for XML Binding)是Java平台上的一个标准组件,用于XML和Java对象之间的绑定,实现了XML的序列化和反序列化。这个技术使得开发者可以方便地将Java对象转换为XML文档,同时也可以从XML...
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,通常用于持久化数据或在网络间传输对象。在Java中,这一过程通过实现Serializable接口并在需要时调用ObjectInputStream的readObject()方法来完成。然而,...
默认情况下,JVM会自动生成这个ID,但如果显式声明,可以更精确地控制序列化兼容性。 总的来说,Java序列化是开发者在处理对象持久化和网络传输时的一项重要工具,但使用时需谨慎处理安全问题,并考虑其在性能和...
当类的结构发生改变时,如果未显式声明`serialVersionUID`,Java会自动生成,如果类结构变化较大,可能导致反序列化失败。为了避免这种情况,开发者可以在类中显式声明`serialVersionUID`,并确保在类的更新中保持...
- **默认生成**:当类首次序列化时,JVM会根据类的结构自动生成一个`serialVersionUID`。 - **手动指定**:为了确保反序列化时的兼容性,开发者可以手动在类中声明一个`static final long serialVersionUID`字段,...
- 自动类型识别:FST能够自动识别并序列化泛型和其他复杂类型,无需额外的类型信息标记。 总之,“Java快速序列化库”如FST,是Java开发中一个强大的工具,特别是在处理大数据量或高频率序列化场景时,能够显著提高...