`
ldh123456
  • 浏览: 22225 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java自动序列化

    博客分类:
  • java
 
阅读更多

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

 

 

 

 

分享到:
评论

相关推荐

    Java反序列化工具.zip

    3. **防御策略**:提供指南或自动化脚本,帮助管理员禁用不必要的序列化,或者部署中间件来过滤不安全的输入。 4. **模拟攻击**:通过模拟真实攻击场景,帮助安全团队评估和增强安全响应能力。 了解Java反序列化...

    Java序列化_Java序列化结构_

    Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...

    java对象序列化和反序列化

    Java对象序列化与反序列化是Java编程中重要的概念,主要应用于数据持久化、网络传输以及存储等场景。本文将详细解析这两个概念及其在实际应用中的实现方式。 **一、Java对象序列化** 1. **定义**: Java对象序列化...

    java serializable 序列化与反序列化

    Java的序列化与反序列化是Java开发中的一项重要技术,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。`Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,...

    Java对象序列化标准最新版

    Java自动处理枚举类型的序列化,无需显式指定序列化策略。 **1.13 保护敏感信息** 在序列化过程中,可能需要处理包含敏感信息的对象。为此,Java提供了一些机制来保护这些信息,例如使用`transient`关键字来标识不...

    Java序列化

    Java序列化是Java平台中的一种标准机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络进行传输或者在某些时候恢复原来的对象状态。这一过程包括两个主要步骤:对象的序列化(将对象转换为字节流)和反...

    java序列化全解

    1. **继承性**:如果一个类是可序列化的,那么它的所有子类也将自动成为可序列化的。然而,如果父类没有实现`Serializable`接口,那么只有子类中定义的字段会被序列化,而父类的字段不会。 2. **静态和transient...

    java序列化实现演示

    当一个类被序列化时,JVM会自动计算该类的`serialVersionUID`,这个值基于类的结构,如字段类型和名称。如果在反序列化时,类的结构发生变化(比如添加、删除或修改了字段),但是`serialVersionUID`未更新,那么就...

    JAVA对象序列化保存为XML文件的工具类

    【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...

    java序列化和反序列化

    - 实现此接口后,Java虚拟机就能够自动进行序列化和反序列化操作。 2. **序列化过程:** - 创建一个`java.io.ObjectOutputStream`实例。 - 使用`ObjectOutputStream`的`writeObject()`方法将对象写出到输出流中...

    Java实验7 序列化.doc

    但是,XStream库能够自动处理这种情况,将关联的`Address`对象也序列化到XML中。 在这个实验中,学习了如何利用第三方库实现Java对象到XML的序列化。XStream库的使用简化了这个过程,使得我们可以方便地在Java对象...

    Java反序列化回显解决方案.docx

    当反序列化这个特殊对象时,它会自动执行命令并将结果发送给预设的地址。 #### 实战案例 假设我们有一个恶意的 `Payload` 类,其构造函数接受一个命令字符串作为参数。当这个对象被反序列化时,它将执行该命令并...

    一个基于java jaxb的序列化例子,非常简单易懂

    Java JAXB(Java Architecture for XML Binding)是Java平台上的一个标准组件,用于XML和Java对象之间的绑定,实现了XML的序列化和反序列化。这个技术使得开发者可以方便地将Java对象转换为XML文档,同时也可以从XML...

    Java 对象序列化详解以及实例实现和源码下载

    Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...

    java反序列化利用

    Java反序列化是一种将已序列化的对象状态转换回对象的过程,通常用于持久化数据或在网络间传输对象。在Java中,这一过程通过实现Serializable接口并在需要时调用ObjectInputStream的readObject()方法来完成。然而,...

    java 序列化 将实体类本地序列化

    默认情况下,JVM会自动生成这个ID,但如果显式声明,可以更精确地控制序列化兼容性。 总的来说,Java序列化是开发者在处理对象持久化和网络传输时的一项重要工具,但使用时需谨慎处理安全问题,并考虑其在性能和...

    java 序列化

    当类的结构发生改变时,如果未显式声明`serialVersionUID`,Java会自动生成,如果类结构变化较大,可能导致反序列化失败。为了避免这种情况,开发者可以在类中显式声明`serialVersionUID`,并确保在类的更新中保持...

    Java对象的序列化与反序列化Java开发Java经验技巧

    - **默认生成**:当类首次序列化时,JVM会根据类的结构自动生成一个`serialVersionUID`。 - **手动指定**:为了确保反序列化时的兼容性,开发者可以手动在类中声明一个`static final long serialVersionUID`字段,...

    Java快速序列化库

    - 自动类型识别:FST能够自动识别并序列化泛型和其他复杂类型,无需额外的类型信息标记。 总之,“Java快速序列化库”如FST,是Java开发中一个强大的工具,特别是在处理大数据量或高频率序列化场景时,能够显著提高...

Global site tag (gtag.js) - Google Analytics