将那些实现了Serializable接口的对象转换成一个字节序列,并且能够在以后将这个字节序列完全恢复为原来的对象,序列化可以弥补不同操作系统之间的差异。
Java远程方法调用(RMI)
对JavaBeans进行序列化
如何实现序列化和反序列化
1. 实现Serializable接口
--该接口是一个可序列化的标志,并没有包含实际的属性和方法。
--如果不在该方法中添加readObject()和writeObject()方法,则采取默认的序列化机制。如果添加了这两个方法之后还 想利用Java默认的序列化机制,则在这两个方法中分别调用defaultReadObject()和defaultWriteObject()两个方法。
--为了保证安全性,可以使用transient关键字进行修饰不必序列化的属性。因为在反序列化时,private修饰的属性也能 被查看到。
2. 实现ExternalSerializeable方法
自己对要序列化的内容进行控制,控制哪些属性能被序列化,哪些不能被序列化。
--实现Serializable接口对象在反序列化时不需要调用对象所在类的构造方法,完全基于字节。
--实现externalSerializable接口的方法在反序列化时会调用构造方法。
--被static修饰的属性不会被序列化
--对象的类名、属性名都会被序列化,方法不会被序列化。
--要保证序列化对象所在类的属性也是可以被序列化的。
--当通过网络、文件进行序列化时,必须按照写入的顺序读取对象。
--反序列化时必须有序列化对象时的class文件。
--最好显示地声明serializableID,因为在不同的JVM之间,默认生成serializeableID可能不同,会造成反序列化失败。
--COM主要用于windows平台,并没有真正实现跨平台,另外COM序列化的原理利用了编译器中虚表,使得其学习成本巨大。
--CORBA是早期比较好的实现了跨平台,跨语言的序列化协议。CORBA的主要问题是参与方过多带来的版本过多,版本之间的兼容性较差,以及使用复杂晦涩。
--XML&SOAP
XML是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点。
SOAP(Simple Object Access protocol)是一种被广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协 议。SOAP具有安全、可扩展、跨语言、跨平台并支持多种传输层协议。
--JSON(Javascript Object Notation)
这种Associative array格式非常符合工程师对对象的理解。
它保持了XML的人眼可读(Human-readable)的优点。
相对于XML而言,序列化后的数据更加简洁。
它具备Javascript的先天性支持,所以被广泛应用于Web browser的应用场景中,是Ajax的事实标准协议。
与XML相比,其协议比较简单,解析速度比较快。
松散的Associative array使得其具有良好的可扩展性和兼容性。