更新时间:2022-08-25 12:38
串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内存缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节(byte)数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。
串行化有以下但不局限于这些优点:
1.串行化是一种更好地使用类持久化的方法
2.可用于远程方法调用,如SOAP
3.一种分布对象的方法,特别是在软件组件中,如COM、CORBA等
4.在随时间变化的数据(time-varying data)检测改变
由于这些特性都是十分有用的,所以必须维持串行化的体系结构独立性。例如在一台运行在不同硬件构架上的计算机应该能够可靠地重新构建数据而不关心其对字节(byte)数据的编排方式(endianness)。
尽管如此,协作要求能够相互识别其串行化的数据。因此像CORBA这样的远程方法调用的架构会详细定义其串行化的格式以及提供相应的方法在重新构建对象时检查数据的一致性。
微软提供的串行化是用于对对象进行文件I/O的一种机制,该机制在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好的应用。
串行化可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据。
对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力,叫做对象的持续性(persistence)。对象通过写出描述自己状态的数值来「记录自己」,这个过程叫对象的串行化(Serialization)。
在java中串行化对象必须:
1、该对象的类必须实现Serializable接口。
2、该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。而对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明 。 (注:保存任何的成员方法和静态的成员变量没有任何的意义,因为对象的类已经完整的保存了他们)
3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
下面是一个简单示例:
importjava.io;
public class Cat implements Serializable {
private String name;
public Cat () {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat cat = new Cat();
try {
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(cat);
oos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
ObjectInputStream ois = new ObjectInputStream(fis);
cat = (Cat) ois.readObject();
ois.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}