Java 对象序列化

作者: 专职跑龙套 | 来源:发表于2017-01-05 14:13 被阅读42次

Java 序列化

实现对象 Object 与字节 byte 的转换。例如在分布式环境中传递对象。

Java 序列化的实现

实现 Serializable 接口,该接口并不包含方法,更像是一个标记。

  • 通过 ObjectOutputStream 中的 writeObject() 方法将对象转换为字节序列。
    实际上操作的是一个对象图,包括该对象所引用的其他对象。
  • 通过 ObjectInputStream 中的 readObject() 方法将字节序列转换为对象。
    遍历对象图并逐个序列化。
    通过 readObject() 方法来创建对象时,不会调用其构造方法。

示例:

public class Serializable_Test {
    public static void main(String[] args) throws Exception {
        MyObj obj = new MyObj("ABC");

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myobj.txt"));
        oos.writeObject(obj);
        oos.flush();
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myobj.txt"));
        MyObj obj2 = (MyObj) ois.readObject();
        ois.close();
        System.out.println(obj2.getName());
    }
}

class MyObj implements Serializable {
    private String name;

    public MyObj(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

以上的代码中,如果 MyObj 没有实现 Serializable 接口,会抛出异常 NotSerializableException

如果希望自定义对象序列化的实现方式:

  • 继承ObjectOutputStream 类,重写 writeObject() 方法
  • 继承ObjectInputStream 类,重写 readObject() 方法

哪些字段会被序列化

在默认的序列化实现中,会包括 非静态域非瞬时域,与域的可见性声明没有关系,可能导致隐私信息泄露。
如果不想让某个字段被序列号,可以使用 transient 关键字,例如将上述代码修改为:
private transient String name;
这样的话,obj2.getName() 会返回 null

关于序列化版本号 serialVersionUID

private static final long serialVersionUID = 1L;

  • 序列化版本号一致,向后兼容
  • 序列化版本号不一致,向后不兼容

例如在类的版本号为1时将对象写入到字节序列,随后将类的版本号改成2,再从字节序列中读取对象,会抛出异常:
java.io.InvalidClassException: advanced.MyObj; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2

相关文章

  • Java-序列化-反序列化

    Thanks Java基础学习总结——Java对象的序列化和反序列化java序列化反序列化原理Java 序列化的高...

  • java序列化那些事儿

    java序列化作用 在说java序列化的作用之前,先说下什么是java序列化吧。java序列化是指把java对象转...

  • 什么是序列化?常见的序列化协议有哪些?

    序列化和反序列化相关概念 什么是序列化?什么是反序列化? 如果我们需要持久化 Java 对象比如将 Java 对象...

  • Java序列化

    Java序列化的几种方式以及序列化的作用 Java基础学习总结——Java对象的序列化和反序列化

  • 序列化(java Serializeable、json、prot

    java序列化 序列化:将对象写入到IO流中反序列化:从IO流中恢复对象意义:序列化机制允许将实现序列化的Java...

  • 认识Java序列化

    我的个人博客,认识Java序列化 引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java ...

  • Java序列化机制

    Java序列化机制 序列化和反序列化 Java序列化是Java内建的数据(对象)持久化机制,通过序列化可以将运行时...

  • 序列化与反序列化

    Java基础学习总结——Java对象的序列化和反序列化 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为...

  • 07-Java序列化面试题(10题)

    1、什么是java序列化,如何实现java序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内...

  • Java序列化

    什么是Java序列化 Java序列化是将对象的状态保存为一组字节,Java反序列化是将这些字节组装成对象。必须注意...

网友评论

    本文标题:Java 对象序列化

    本文链接:https://www.haomeiwen.com/subject/jbnsvttx.html