序列化:把对象转换为字节序列的过程
反序列化:把字节序列恢复为对象的过程
什么情况下需要序列化:
1、当你想把的内存中的对象状态保存到一个文件中或者数据库中时候
2、当你想用套接字在网络上传送对象的时候
3、当你想通过RMI传输对象的时候
JDK类库中的序列化API
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。 只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可
以采用默认的序列化方式 。
对象序列化包括如下步骤:
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
2) 通过对象输出流的writeObject()方法写对象。
对象反序列化的步骤如下:
1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
2) 通过对象输入流的readObject()方法读取对象。
示例:
public class PhoneNumber implements Serializable{ private static final long serialVersionUID = 1L; private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber(short areaCode, short prefix, short lineNumber) { this.areaCode = areaCode; this.prefix = prefix; this.lineNumber = lineNumber; } @Override public boolean equals(Object o) { if(o == this) { return true; } if(!(o instanceof PhoneNumber)) { return false; } PhoneNumber number = (PhoneNumber)o; return number.lineNumber == lineNumber && number.prefix == prefix && number.areaCode == areaCode; } } public class TestSerializable { public static void main(String[] args) throws Exception, IOException { serializable(); PhoneNumber p = Deserializable(); System.out.println(p); } private static void serializable() throws IOException { ObjectOutputStream ob = new ObjectOutputStream(new FileOutputStream("D://PhoneNumber.txt")); PhoneNumber p = new PhoneNumber((short)100,(short)101,(short)102); ob.writeObject(p); } private static PhoneNumber Deserializable() throws ClassNotFoundException, IOException { ObjectInputStream oi = new ObjectInputStream(new FileInputStream("D://PhoneNumber.txt")); PhoneNumber p = (PhoneNumber) oi.readObject(); return p; } }
序列化PhoneNumber成功后在D盘生成了一个PhoneNumber.txt文件,而反序列化PhoneNumber是读取D盘的PhoneNumber.txt后生成了一个PhoneNumber对象.
serialVersionUID的作用
serialVersionUID: 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
serialVersionUID的取值是Java运行时环境根据类的内部细节自动生成的。如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID的取值有可能也会发生变化。
类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID,也有可能相同。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。
显式地定义serialVersionUID有两种用途:
1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
如果将上例中的PhoneNumber的serialVersionUID注释掉,并且在PhoneNumber中添加一个childPhoneNUmber域,这个时候再去利用生成的PhoneNumber.txt反序列化PhoneNumber,也会报异常。但是如果解除serialVersionUID的注释,则可以正常反序列化。
将上面示例的serialVersionUID改为2L,这个时候再去利用生成的PhoneNumber.txt反序列化PhoneNumber,也会导致InvalidClassException。
相关推荐
c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例
1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。 SOAP...
基于C#+XML实现的对象序列化与反序列化的程序例子代码.
通过一个章节来讲解序列化与反序列化,对binaryformatter soapformatter xmlserializer这三种序列化的详情讲解,希望对大家有所帮助。
java 对象的序列化与反序列化 java 对象的序列化与反序列化
主要介绍了Java中对象序列化与反序列化,较为详细的分析了java中对象序列化的概念、原理、实现方法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
比如下面的JS对象 var user=new Object(); user.name='吕洞宾'; user.friends=[{name:"铁拐李",sex:"男",friend:user},{name:"何仙姑",sex:"女",friend:user}]; 一般的解析工具都会出错 详细信息请参观 ...
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
什么叫反序列化? 就是再把介质中的东西还原成对象,把石子还原成人的过程。 在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。 通常网络程序为了传输安全才这么做。不...
对象序列化和反序列化流
C# xml序列化及反序列化(解析xml为对象及对象转xml保存),方法一反序列化取节点KV值,方法二反序列化取节点标签值,方法三取节点KV值,并增加节点对象数组及节点标签组合反序列化
java对象 java序列化 java反序列化
JAVA对象的序列化与反序列化详细PPT课件.pptx
基于WindowForm应用程序C#语言通过实际案例实现将对象保存到文件及从已保存的文件中读取对象(直接保存与读取、通过序列化与反序列化方式进行对象保存与读取)
主要介绍了java对象序列化与反序列化的默认格式和json格式使用示例,需要的朋友可以参考下
c#对象 序列化 和 反序列化 ,压缩流
Vbs序列化/反序列化Json基类 可直接使用,bug已被我修复 Example: Dim fso, json, str, o, i Set json = New VbsJson Set fso = WScript.CreateObject("Scripting.Filesystemobject") str = fso.OpenTextFile(...
极好的序列化与发序列化代码。可以处理array集合,数组或者单个对象等的序列化与反序列化。
对象的序列化和反序列化
这是一个用C#写的Socket服务器和客户端,当然Socket服务器和客户端不是主要的(有兴趣的朋友可以参考下),主要的内容是介绍如何通过这种Socket方式发送Object对象。 作者博客 http://luyugao.com