public static void main(String[] args) throws IOException, ClassNotFoundException {
//--ObjectInputStream/ObjectOutputStream--对象输入/输出流
int a = 3;
//程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(a);
System.out.println("序列化后a的字节数:" + bos.toByteArray().length);
oos.flush();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
int c = (Integer) ois.readObject();
}
输出结果:
序列化后a的字节数:81
众所周知,一个int型长度是4个字节,由输出结果知,序列化之后长度变成81,可知序列化的成本是很高的。
下面写个深拷贝中应用序列化的例子:
public class TestSerializeSize {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//--ObjectInputStream/ObjectOutputStream--对象输入/输出流
TV tv = new TV();
tv.setName("changhong");
tv.setPrice(1200);
tv.setAddress(new Address());
//int a = 3;
System.out.println(tv);
System.out.println(tv.getAddress());
ByteArrayOutputStream bos = new ByteArrayOutputStream();//程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(tv);
System.out.println("序列化后字节数:" + bos.toByteArray().length);
oos.flush();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
TV tv2 = (TV) ois.readObject();
System.out.println(tv2);
System.out.println(tv2.getAddress());
//int c = (Integer) ois.readObject();
}
}
class TV implements Serializable{
private String name ;
private int price;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
class Address implements Serializable{
}
输出结果:
com.prac.util.serializable.TV@3fbefab0com.prac.util.serializable.Address@133c5982
序列化后字节数:202
com.prac.util.serializable.TV@2efd552
com.prac.util.serializable.Address@4f9dfbff
可以观察序列化之后TV和Address内存地址都是不相同的,深拷贝就是采用序列化的策略。