设为首页 加入收藏

TOP

Java对象序列化(二)
2014-11-23 19:53:04 来源: 作者: 【 】 浏览:61
Tags:Java 对象 序列化
2 = new ObjectOutputStream(byteOutStream);
oos2.writeObject("Worm storage By ByteOutputStream ");
oos2.writeObject(w);
oos2.flush();

//反序列操作2--ByteArrayInputStream
ByteArrayInputStream byteInStream = new ByteArrayInputStream(byteOutStream.toByteArray());
ObjectInputStream ois2 = new ObjectInputStream(byteInStream);
String s2 = (String)ois2.readObject();
Worm w2 = (Worm)ois2.readObject();
ois2.close();
System.out.println("反序列化操作2之后");
System.out.println(s2);
System.out.println("w2:"+w2);
}


}



运行的结果如下:



Worm constructor:6
Worm constructor:5
Worm constructor:4
Worm constructor:3
Worm constructor:2
Worm constructor:1
序列化操纵之前
w=:a(853):b(119):c(802):d(788):e(199):f(881)
反序列化操作1之后
Worm storage By FileOutputStream
w1::a(853):b(119):c(802):d(788):e(199):f(881)
反序列化操作2之后
Worm storage By ByteOutputStream
w2::a(853):b(119):c(802):d(788):e(199):f(881)



思考:


1)反序列化后的对象,需要调用构造函数重新构造吗?


答案:不需要。对于Serializable对象,对象完全以它存储的二进制位作为基础来构造,而不调用构造器。


请看下面这段代码



package test.serializable;


import java.io.Serializable;
import java.util.Date;


/**
*
* @author chenfei
*
* 用于测试序列化时的deep copy
*
*/
public class House implements Serializable {
private static final long serialVersionUID = -6091530420906090649L;

private Date date = new Date(); //记录当前的时间

public String toString() {
return "House:" + super.toString() + ".Create Time is:" + date;
}


}




package test.serializable;


import java.io.Serializable;


public class Animal implements Serializable {
private static final long serialVersionUID = -213221189192962074L;

private String name;

private House house;

public Animal(String name , House house) {
this.name = name;
this.house = house;
System.out.println("调用了构造器");
}

public String toString() {
return name + "[" +super.toString() + "']" + house;
}


}




package test.serializable;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;



public class Myworld {


/**
* @param args
* @throws IOException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws IOException, ClassNotFoundException {
House house = new House();
System.out.println("序列化前");
Animal animal = new Animal("test",house);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(animal);
oos.flush();
oos.close();


System.out.println("反序列化后");
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(in);
Animal animal1 = (Animal)ois.readObject();
ois.close();
}


}



运行结果如下所示:


序列化前
调用了构造器
反序列化后


从上面的结果中可以看到,在序列化前,当我们使用
Animal animal = new Animal("test",house);


时,调用了Animal的构造器(打印了输出语句),但是反序列后并没有再打印任何语句,说明并没有调用构造器。


2)序列前的对象与序列化后的对象是什么关系?是("=="还是equal?是浅复制还是深复制?)


答案:深复制,反序列化还原后的对象地址与原来的的地址不同。 我们还是看上面思考1)中给出的代码,前两个类不变化,修改第三个类(MyWorld.java)的部分代码,修改后的代码如下:




package test.serializable;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下用C实现Ping监测与HTTP报.. 下一篇Python向PHP发起GET与POST请求

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: