• java序列化


    何为序列化

    序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。如果某个类能够被序列化,其子类也可以被序列化。需要注意的是声明为static和transient类型的成员数据不能被序列化,因为static代表类的状态,transient代表对象的临时数据。

    为什么需要序列化?

    第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,这时候就需要把对象进行序列化之后保存。

    第二种情况是:需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,在接收端读到二进制数据之后反序列化成Java对象。

    使用场景

    1,对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
    2,java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的”深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

    序列化 ID 的作用

    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。因此为了实现序列化接口的实体能够兼容先前版本,最好显式地定义一个名为serialVersionUID类型为long的变量,这样就不会存在版本不一致的问题。

     序列化方式

     1 原生序列化

    Java原生序列化方法即通过Java原生流(InputStream和OutputStream之间的转化)的方式进行转化。需要注意的是JavaBean实体类必须实现Serializable接口,否则无法序列化。

    优点:java原生支持,不需要提供第三方的类库,使用比较简单。

    缺点:无法跨语言,字节数占用比较大,某些情况下对于对象属性的变化比较敏感。

    2 json序列化

    JSON工具类有许多种,这里列出三个比较流行的json工具类:Jackson,Gson,FastJson.

    1)Jackson

    2)Gson

    3)FastJson

  • 相关阅读:
    Cocos2dx使用ios内支付IAP具体流程-白白
    Linux下完美使用find+grep实现全局代码搜索
    扩展GCD 中国剩余定理(CRT) 乘法逆元模版
    java实现floyd统计天津地铁的网站距离
    并查集
    HTML5:理解head
    Pivotal Cloud Foundry安全原理解析
    tar、7z(7zip)压缩/解压缩指令的使用
    Linux下C编程的学习_1
    【leetcode】Find Minimum in Rotated Sorted Array I & II (middle)
  • 原文地址:https://www.cnblogs.com/wuchanming/p/8427508.html
Copyright © 2020-2023  润新知