关键字: 序列化 反序列化 对象 serializable
之前看公司RMI服务里多数类都实现了序列化接口(implements Serializable),但确怎么也不知道序列化是怎么一回事,上网查了很多序列化的概念,但那些概念太抽象了,还是无法理解,直到今天,终于有了一些自己的理解,在这里写出来,希望对与我存在同样困扰的朋友们能有所帮助。
我们都知道,当我们new一个对象的时候,Java就会在内存中创建一个相应的对象供我们后续使用。如果我们把这个Java程序关掉的话,那么这个对象也就随着我们程序的关闭而消失,如何才能在这种情况下继续保存这个对象呢?这就是Java序列化要做的事情。
简单地说,Java对象列化就是要把内存中的Java对象保存下来(持久化),以便可以在网络上传输或今后继续使用这个对象中的数据。
那么对象序列化到底做了哪些事呢?其实很简单,一个对象对于我们来说的意义其实就是对象里保存的那些数据,序列化就是把这些数据转换成二进制表示的对象流,你可以把它通过网络传输到远程,当然,也可以把这些信息保存在本地的文件里。下面给出一个最简单的Java的序列化与反序列化的例子,看懂这个例子,相信你应该也能跟我一样,大概理解这是怎么一回事了。
首先是一个Peraon类:
Person.java
-
packagecom.lanber.serial;
-
-
importjava.io.Serializable;
-
-
publicclassPersonimplementsSerializable{
-
privateStringname;
-
privateintage;
-
privateStringsex;
-
privateStringnationality;
-
-
publicPerson(String_name,int_age,String_sex,String_nationality){
-
this.name=_name;
-
this.age=_age;
-
this.sex=_sex;
-
this.nationality=_nationality;
-
}
-
-
publicStringtoString(){
-
return"Name:"+name+"/nAge:"+age+"/nSex:"+sex
-
+"/nNationality:"+nationality+"/n/n";
-
}
-
}
而后我们要实例化一个Person对象,把我们实例化出来的这个对象序列化,并把序列化后的对象流保存到文件中去:
WritePerson.java
-
packagecom.lanber.serial;
-
-
importjava.io.*;
-
-
publicclassWritePerson{
-
-
publicstaticvoidmain(String[]args){
-
try{
-
ObjectOutputStreamoos=newObjectOutputStream(
-
newFileOutputStream("Person.tmp"));
-
Personobj=newPerson("Tony",25,"Female","han");
-
System.out.println("将Person对象写入到文件Person.tmp中...");
-
oos.writeObject(obj);
-
oos.close();
-
System.out.println("完成!");
-
}catch(Exceptione){
-
System.out.println(e);
-
}
-
-
}
-
}
这样,我们就把序列化后的二进制对象流保存到Person.tmp的文件中去了(特别要注意这里的oos.writeObject()方法,这个方法就是实现把obj对象序列化的方法)。你可以打开生成的这个文件查看,不过我们是看不懂这里面的信息的,因为这是二进制数据啊。
那我们要怎么才能看懂这些二进制数据呢?这就要用到我们的反序列化了。反序列化就是要把序列化后的二进制数据反向解析成可以正常使用的Java对象。现在让我们来把刚才的那个对象反序列化一下吧:
ReadPerson.java
-
packagecom.lanber.serial;
-
-
importjava.io.*;
-
-
publicclassReadPerson{
-
publicstaticvoidmain(String[]args){
-
Personobj=null;
-
try{
-
ObjectInputStreamois=newObjectInputStream(newFileInputStream(
-
"Person.tmp"));
-
obj=(Person)ois.readObject();
-
System.out.println(obj);
-
ois.close();
-
}catch(Exceptione){
-
System.out.println(e);
-
}
-
}
-
-
}
要注意一下这个语句:
-
obj=(Person)ois.readObject();
就是通过这个语句把序列化后的对象流反序列化成正常的Java对象的。
以上就是本人对Java对象序列化与反序列化的理解,纯属入门级别的理解,若有不正之处,还望javaeye的高手们多多批评指正,不胜感激!
分享到:
相关推荐
1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。 SOAP...
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
序列化的过程就是对象写入字节流和从字节流中读取对象。...对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。
对象序列化和反序列化流
提出了一种基于JSON的对象序列化算法,该算法通过分析JSON文法并建立对象导航图,透明地将Java对象序列化成JSON表达式,使客户端能够很好地利用JavaScript引擎来解析JSON响应,有效地解决了解析XML所造成的缺陷。
将Java对象序列化成ISO-8859-1、Base64字节流和Xml字符串三种方式。
对象序列化.ppt 对象序列化.ppt 对象序列化.ppt 对象序列化.ppt 对象序列化.ppt
在java.beans包中,有两个好东西,XMLEncoder和XMLDecoder。从XML存取对象真是太费力气啦。做了小工具类,以后可以用用了。本文介绍了这两个可以把JAVA对象序列化保存为XML文件的工具类。
c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例c#对象序列化与反序列化实例
通过一个章节来讲解序列化与反序列化,对binaryformatter soapformatter xmlserializer这三种序列化的详情讲解,希望对大家有所帮助。
对象序列化TCP传输 对象序列化TCP传输 对象序列化TCP传输 对象序列化TCP传输
VS、VC++实现对象序列化保存到sqlite表blob类型字段中,包含blob字段的读取和保存,文档中有代码及说明实例。
.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化(Q群号:152088818 本群只为有经验的.NET开发者...
java 序列化对象 MARSHALLING UNMARSHALLING
c#对象 序列化 和 反序列化 ,压缩流
实现android 对象序列化,在传递数据时可用Intent传递对象
java基础 对象序列化
对象序列化 串行化 实现java对象的保存
C#对象序列化 源代码
这是Java序列化标准规范,对于研究序列化源码能够提供指导作用,为深入研究Java序列技术奠定基础。