你的位置:首页 > Java教程

[Java教程]java序列化知识整理


1. 什么是序列化?

  序列化就是只把一个对象串行化成一个字节流,用于网络传输或者持久化。

2. 序列化的使用场景?

  a). 把内存中的对象持久化到文件或者数据库中;

  b). 对象在网络上传输。

3. 序列化的实现?

  1). 实现Serializable接口:

    此方法简单,没有任何需要实现的方法。

    笔者从业(web开发)两年一直使用该方法,本文以下主要讲解此方法。

  2). 实现Externalizable 接口: Externalizable 是Serializable的子接口
    此方法需要实现的方法,可以自己控制序列化的属性。

4. Serializable序列化的使用注意点

  1. 序列化ID必须一致。

    虚拟机允许反序列化有三个条件:类路劲一致,功能代码一致,两个类的序列化ID一致;

  2. 对象A中引用对象B,A实现了序列化,则B也会被序列化;

  3. 父对象实现序列化,则子对象也会被序列化

  4. 子类对象被序列化,则父类对象不会被序列化,反序列化时调用默认的无参构造函数构造对象;

  5. 序列化的对象中有属性前有transient修饰符时,该属性不会被序列化,因为该transient属性是临时的;

  6. 序列化的对象中有属性前有static修饰符时,该属性不会被序列化,因为static代表次属性是类属性不是对象属性;

  7. 序列化的对象中有属性属于敏感字段,需要加密传输,则需要自定义序列化和反序列化。需要注意的是,即使对象的属性是private也是不安全的,只有人工进行安全处理。

    自定义方法:在序列化的类中自定义writeObject() 和 readObject()方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化,

  如果没有这样的方法,则默认调用是 ObjectOutputStream 的 defaultWriteObject 方法以及 ObjectInputStream 的 defaultReadObject 方法。

  6. 序列化存储规则:当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,文件大小不会翻倍,只是略有增加(新增引用的控制信息)。