
串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内存缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节(byte)数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。
- 中文名 串行化
- 定 义 是指将对象存储到介质
- 英 文 (Serialization)
- 优 点 可用于远程方法调用
特性
来自 串行化有以下但不局限于360百科这些优点:
1.串行化是一种更好地使用类持久化的方法
2.可用于远程方法调用,如SOAP
3.一种分布对象的方法,特别是在软件组件磁个量影中,如COM、CORBA等
4.在随时间变化的数据(time-varying data)检测改变
由于这些特性都是十分有用的,所以必须维持串行化的体系结构独立性。例加念雨草如在一台运行在不同硬件构架上的计算机应该能够可靠地重新构儿脸字洋测建数据而不关心其对字节(byte)数据的编排方式(endianness)。
影响
但是,由于串行化可能将暴露私有实现细节从而打破了抽象数据结构的不透明性。为了不让竞争对手做出兼容的产品,很多私有软件开发商都是将其程序的串行化格式作为机密的,因此他们可能故意题选法混淆或加密其串行事二期甲足贵化的数据。
尽管如此,现在的协作要求能够相互识别其串行化的数据。因此像CORBA这样的远程方法调用的架构会详细定义其串行化的格式以及提供相应的方法在重新构建对象时检查数据的一致性。
编程语言
来自 很多面向对象的语言都提供对串行化支持,无论是通过语法糖(Syntactic sugar技似和庆的染顶消者七)还是通过定义标准的接口来实现扩材提德底承。
微软有关
微软提供的串行化是用于对对象进行文件I/O的一种机制威,该机制在框架(积促处季顺算苦位富划Frame)/文360百科档(Document)/视图(View) 模式中得到了很好的应用。
串加陈许终触正从行化可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来货的数据。
对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象界争底湖高战恢复。我们把对象的这种能记录自己的状态以便将来再生的能力,叫做对象的持续性(persistenc走士e)。对象通过写出描阶快述自己状态的数值来「记录自己」,这个过程叫对象的串行化(Serialization)。
Java
规举孔地仅攻烈率谁 在java中串行化对象必须:
1、该对象的类必须实现Serializable接口。
2、该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。而对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其还情江入校石妒集攻状态的,例如一个Thread对象,或一个FileInputStre找听振际续余am对象,对于这些字段述,我们必须用transient关键字标明 。 (注:保存任何的成员方法和静态的成员变量没有任何的意义,因为对象的类已经完整的保存了他们)
3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输术室县零镇出流将对象状态保存下来,道联波画再通过对象输入流将对象状态恢复。
下面是一个简单示例:
importjava.io;
public c官光群执觉袁意点lass Cat implements Seriali速头食朝通最阶zable {
private String name;
public Cat () {
this.name = "new cat";
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
pub地曲起清春兰罗示染lic static void main(String[] args) {
Cat cat = new Cat();
try {
FileOutputStream fos = new FileOutputStream("catDemo.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(" 1> " + cat.getName());
cat.setName("My Cat");
oos.writeObject(cat);
oos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
FileInputStream fis = new FileInputStream("catDemo.out");
ObjectInputStream ois = new ObjectInputStream(fis);
cat = (Cat) ois.readObject();
System.out.println(" 2> " + cat.getName());
ois.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}