zoukankan      html  css  js  c++  java
  • 简单理解序列化和反序列化java

    https://zhuanlan.zhihu.com/p/62190281

    今天,来总结一下感觉被遗忘了很久的JavaSE基础中的序列化和反序列化的概念。


    序列化:是把对象转换为字节序列,永久存到磁盘中。在网络中传输对象也要进行序列化。

    反序列化:是从磁盘中读取字节序列将它们反序列化成对象读出来。

    【序列化的使用】

    ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

    ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

    注:只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

    默认的序列化方式 。

    【对象序列化步骤】

    1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

    2) 通过对象输出流的writeObject()方法写对象。

    【对象反序列化的步骤】

    1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

    2) 通过对象输入流的readObject()方法读取对象。

    【序列化版本号】

    s​e​r​i​a​l​V​e​r​s​i​o​n​U​I​D​:​ ​字​面​意​思​上​是​序​列​化​的​版​本​号​,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量

    那怎么来生成序列化版本号呢?

    方式一:

    方式二:

    序列化版本号的作用

    当实现了Serializable的类(没有定义序列化版本号)序列化成功后进行了修改,当对这个类的实例对象进行反序列化时就会报错,因为这个对象的序列化版本号在类修改之后和之前的对应不上了(安全机制)。

    解决办法:

    在定义这个类时就指定一个序列化版本号,这样编译器就不会自动为其设置版本号。

  • 相关阅读:
    python
    python
    日常使用 小技巧 ~ (长期更新)
    日常的 小 bug ~(长期更新)
    BUUCTF Re部分wp(MIPS特别篇)
    [FlareOn5]FLEGGO
    [FlareOn6]BMPHIDE
    配置搭建单机rocketmq及rocketmq集群
    nessus服务安装与使用
    HTTP缓存技术详解
  • 原文地址:https://www.cnblogs.com/sunny3158/p/14341669.html
Copyright © 2011-2022 走看看