JAVA原生序列化协议

把对象按照一定的协议格式序列化为数据流,这样用于存储或传输对象。本文主要介绍JAVA原生的序列化协议。

序列化类别

文本序列化和二进制序列化

文本序列化

常用的文本序列化方式:XML、JSON等。文本序列化协议最大的优势在于可读性强和跨语言强。缺点也是显而易见的,效率低。

二进制序列化

  • Protocol Buffers
  • Thrift
  • Java序列化
    可读性差,但高效。

JDK

JDK1.1起, sun就有Java Object Serialization Specification定义java的序列化方式。

class List implements java.io.Serializable {
    int value;
    List next;
    public static void main(String[] args) {
        try {
            List list1 = new List();
            List list2 = new List();
            list1.value = 17;
            list1.next = list2;
            list2.value = 19;
            list2.next = null;

            ByteArrayOutputStream o = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(o);
            out.writeObject(list1);
            out.writeObject(list2);
            out.flush();
            ...
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

把二进制写入文件后,可以用编辑器或者在Linux命令下使用hexdump查看文件。

00: ac ed 00 05 73 72 00 04 4c 69 73 74 69 c8 8a 15
10: 40 16 ae 68 02 00 02 49 00 05 76 61 6c 75 65 4c
20: 00 04 6e 65 78 74 74 00 06 4c 4c 69 73 74 3b 78
30: 70 00 00 00 11 73 71 00 7e 00 00 00 00 00 13 70
40: 71 00 7e 00 03

序列化文件头

ac ed :STREAM_MAGIC声明使用了序列化协议
00 05 :STREAM_VERSION序列化协议版本
73 :TC_OBJECT声明这是一个新的对象

注意事项

虽然Java的序列化能够保证对象状态的持久保存,但是遇到一些对象结构复杂的情况还是比较难处理的,下面是对一些复杂情况的总结:

  • 当父类实现了Serializable接口的时候,所有的子类都能序列化
  • 子类实现了Serializable接口,父类没有,父类中的属性不能被序列化(不报错,但是数据会丢失)
  • 如果序列化的属性是对象,对象必须也能序列化,否则会报错
  • 反序列化的时候,如果对象的属性有修改或则删减,修改的部分属性会丢失,但是不会报错
  • 在反序列化的时候serialVersionUID被修改的话,会反序列化失败
  • 在存Java环境下使用Java的序列化机制会支持的很好,但是在多语言环境下需要考虑别的序列化机制,比如xml,json,或则protobuf

参考(https://www.cnblogs.com/senlinyang/p/8204752.html)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,664评论 19 139
  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 11,204评论 0 24
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,781评论 18 399
  • 拿不定设计?让经典的尼尔森十大可用性原则帮你!(附案例) 以简书为案例讲述「尼尔森十大可用性原则」 尼尔森的十大可...
    方伟在学习阅读 618评论 0 1
  • 投射女儿能够控制住情绪,自控对一个人的成长是多么有用,自己控制自己的感情,自己消化自己的感情,是多么的困难,很多成...
    珊爸阅读 121评论 0 0

友情链接更多精彩内容