Java 编程思想中是这么描述序列化的:
Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,自动弥补不同操作系统之间的差异
对象序列化主要是为了支持如下两种主要特性:
一是Java的远程方法调用RMI,使存活于其他计算机上的对象使用起来就像是存活于本机一样。再者,对Java Beans来说,对象的序列化也是必需的,使用一个Bean时,在设计阶段对它的状态信息进行配置,并保存这些信息,在程序启动时进行后期恢复。
对象序列化为字节的过程:
创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,调用writeObject()即可将对象序列化,并将其发送给OutputStream
字节序列还原为对象的过程:
创建某些InputStream对象,然后将其封装在一个ObjectInputStream对象内,调用readObject()即可还原为对象,还原回来的对象是Object,需要类型转换
对象序列化时基于字节的,要使用字节输入流/输出流
对象序列化不仅保存了对象的“全景图”,而且能追踪对象内所包含的所有引用
下面通过一些示例演示序列化相关的一些细节问题
反序列化回来的对象和原对象内容一致,但是一个新对象
class SerializableDemo implements Serializable {
/**
*
*/
private static final long serialVersionUID = -707015875588596115L;
private String name;
public SerializableDemo(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SerializableDemo other = (SerializableDemo) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "SerializableDemo [name=" + name + "]";
}
}
public static void seri(SerializableDemo demo) {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("my.txt"))) {
oos.writeObject(demo);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
public static SerializableDemo desri() {
try (ObjectInputStream oin = new ObjectInputStream(new FileInputStream("my.txt"))) {
SerializableDemo demo = (SerializableDemo) oin.readObject();
return demo;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
SerializableDemo demo = new SerializableDemo("Tom");
seri(demo);
SerializableDemo newDemo = desri();
System.out.println(newDemo);
System.out.println(demo == newDemo); // false
System.out.println(demo.equals(newDemo))