Java对象的序列化和反序列化实践

2013-12-20 14:58

对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上或者通过网络将之传送到另一个网络节点。

而一旦其他程序获得这种二进制流,即可将之恢复为Java对象。

转载自: http://dev.yesky.com/76/7562076.shtml

文中,原作者提到了两种序列化&反序列化的方式, 一是直接利用流对象来read/write,这种方式比较简单,按照默认方式序列化,所以有时候需要自己控制类的序列化方式,可以在可序列化类中提供以下形式的writeObject()和readObject()方法。

当进行序列化&反序列化操作时,如果有这两个方法,那么会优先执行这两个方法,测试代码如下:

 1 public class ObjectSaver {
 2 
 3     public static void main(String[] args) throws Exception {
 4         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
 5                 "objectFile.obj"));
 6 
 7         // 序列化对象
 8         Customer customer = new Customer("阿蜜果", 24);
 9         out.writeObject("你好!");
10         out.writeObject(new Date());
11         out.writeObject(customer);
12         out.writeInt(123); // 写入基本类型数据
13         out.close();
14 
15         // 反序列化对象
16         ObjectInputStream in = new ObjectInputStream(new FileInputStream(
17                 "objectFile.obj"));
18         System.out.println("obj1=" + (String) in.readObject());
19         System.out.println("obj2=" + (Date) in.readObject());
20         Customer obj3 = (Customer) in.readObject();
21         System.out.println("obj3=" + obj3);
22         int obj4 = in.readInt();
23         System.out.println("obj4=" + obj4);
24         in.close();
25     }
26 }
27 
28 class Customer implements Serializable {
29     private static final long serialVersionUID = 1L;
30     private String name;
31     private int age;
32 
33     public Customer(String name, int age) {
34         this.name = name;
35         this.age = age;
36     }
37 
38     public String toString() {
39         return "name=" + name + ", age=" + age;
40     }
41 
42     private void writeObject(java.io.ObjectOutputStream out) throws IOException {
43         out.defaultWriteObject();
44         System.out.println("writeObject==========");
45         out.writeObject(name);
46         out.writeInt(age);
47     }
48 
49     private void readObject(java.io.ObjectInputStream in) throws IOException,
50             ClassNotFoundException {
51         in.defaultReadObject();
52         System.out.println("writeObject==========");
53         name=(String) in.readObject();
54         age=in.readInt();
55     }
56 }

如上,如果没有write&read两个方法,程序能正常执行。

如果write&read两个方法存在,但方法体为空,那么发序列化结果为null;

write&read两个方法存在,则只有按照上面代码,结果才是正确的。

有兴趣的可以自己试试。

原文地址:https://www.cnblogs.com/wlrhnh/p/3483889.html