阅读122 返回首页    go 阿里云 go 技术社区[云栖]


Java序列化和反序列化

  • 序列化:Java对象转换为字节序列
  • 反序列化:字节序列转换为Java对象

实现了Serializable或Externalnalizable接口的接口或类,通过ObjectInputStream或ObjectOutputStream可以进行二进制文件与Java对象之间的转换。

Serializable

  • 实现了Serializable的对象,可以将该对象的非transient的实例变量进行序列化或反序列化。
  • 若重写了 readObject(ObjectInputStream in)writeObject(ObjectOutputSteam out) 方法,则会调用这两个方法进行序列化或反序列化。

PS:non-transient字段不会参与序列化会反序列化,这样,有时传输数据对象可以节省不必要的时空开销。


普通序列化

MyObject obj = new MyObject("zou", "male");

// 序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/user/zoujs/documents/java.obj"));
out.writeObject(obj);
out.close();

// 反序列化
ObjectInputStream in = new ObjectInputStream(new FileOutputStream("/user/zoujs/documents/java.obj"));
MyObject object = (MyObject)in.readObject();
in.close();

结合从前写的Closeable的文章,可以将代码写成如下形式。

// 序列化
MyObject obj = new MyObject("zou", "male");
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/users/zoujs/documents/java.obj"))){
    out.writeObject(obj);
}

// 反序列化
MyObject object;
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("/user/zoujs/documents/java.obj"))){
    object = (MyObject)in.readObject();
}

readObject()writeObject() 方法的序列化和反序列化

这两个方法可以在序列化和反序列化时定制用户的行为,即使它们被生命为private,但这丝毫不影响它们的作用。
实际上,ObjectInputStream和ObjectOutputStream通过反射来寻找对象是否实现了这两个方法,


最后更新:2017-08-21 20:02:16

  上一篇:go  记一次阿里云ECS实例预约迁移
  下一篇:go  Closeable