- 浏览: 590614 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
kangh:
转载的也拿出来 都不试一下 完全错误
Nginx+ffmpeg的HLS开源服务器搭建配置及开发详解 -
wangtxlz:
#cd builders/cmake#cmake .系统提示命 ...
crtmpserver流媒体服务器的介绍与搭建 -
hnraysir:
支持支持支持
手机Android音视频采集与直播推送,实现单兵、移动监控类应用 -
wuent:
把web服务器和php框架绑定到一起?真不建议这样。。。
Swoole(PHP高级Web开发框架) -
wuent:
有更详细的性能比较吗?php,python,java
PHP中的(伪)多线程与多进程
在JAVA中,一个大的应用程序需要保存很多对象的时候,由于虚拟机内存有限,(资源宝贵啊 )有时不可能所有有用的对象都放到内存中,因此,需要将不常用的对象暂时持久化的文件中,当需要这个对象时,再从文件把对象恢复到内存中,这就是所谓对象的序列化和反序列化。本文讲实现如何将对象序列化到文件,然后再从文件反序列化到对象,你会发现其实特别简单
先看一下对象的序列化和反序列化的关键是什么
1,首先被序列化的对象必须实现 java.io.Serializable 接口,咳~~咳~~,其实这个接口没定义任何方法
2,序列化时,需要用到对象输出流ObjectOutputStream ,然后通过文件输出流构造 ObjectOutputStream 对象调用writeObject写入到文件
3,反之,反序列化时用到对象输入流ObjectIntputStream, 然后通过文件输出流构造 ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型
4,注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量)
5,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错
好了,现在我们做一个实例,我们现在要序列化一个会员对象到文件里,然后再把它读出来
先创建会员类
Java代码
Java代码
序列化完毕
今天是:
Thu Oct 23 18:31:11 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕
我们看代码总结一下,serialize方法实现了对象的序列化功能,讲对象序列化到文件,使用了文件的输出流ObjectOutputStream 的writerObject方法一次写入一个对象,对象在文件中按写入顺序存储。
deserialize方法实现反序列化,从文件将对象反序列化到内存,使用了ObjectIntputStream 的readObject方法,因为序列化对象是按照写入顺序存储的,所以在反序列化时必须按照写入顺序读取
大家看了结果就应该知道了,标明transit的实例变量是没被序列化进去的 ,呵呵
其实序列化的意义不止如此,不但可以将对象放到文件流,还可以放到网络流里,比如我们做的Socket程序,你不但可以发送给对方一行消息,还可以发送过去一个对象,我估计QQ就不止是把我们的消息发送到对方,应该是一个对象,里面包含了发送者的信息
接下来这次我们讲的是控制对象的序列化和反序列化
控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据
我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable
Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容
好了,现在我们改写上例的UserInfo
Java代码
改写测试类
Java代码
现在执行序列化方法
序列化完毕
现在执行反序列化方法
Thu Oct 23 22:18:12 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕
首先,我们在序列化UserInfo对象的时候,由于这个类实现了Externalizable 接口,在writeExternal()方法里定义了哪些属性可以序列化,哪些不可以序列化,所以,对象在经过这里就把规定能被序列化的序列化保存文件,不能序列化的不处理,然后在反序列的时候自动调用readExternal()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列
先看一下对象的序列化和反序列化的关键是什么
1,首先被序列化的对象必须实现 java.io.Serializable 接口,咳~~咳~~,其实这个接口没定义任何方法
2,序列化时,需要用到对象输出流ObjectOutputStream ,然后通过文件输出流构造 ObjectOutputStream 对象调用writeObject写入到文件
3,反之,反序列化时用到对象输入流ObjectIntputStream, 然后通过文件输出流构造 ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型
4,注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量)
5,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错
好了,现在我们做一个实例,我们现在要序列化一个会员对象到文件里,然后再把它读出来
先创建会员类
Java代码
import java.io.*; import java.util.*; //一定要实现Serializable接口才能被序列化 public class UserInfo implements Serializable { public String userName; public String userPass; //注意,userAge变量前面的transient public transient int userAge; public UserInfo(){ } public UserInfo(String username,String userpass,int userage){ this.userName=username; this.userPass=userpass; this.userAge=userage; } public String toString(){ return "用户名: "+this.userName+";密码:"+this.userPass+ ";年龄:"+this.userAge; } } import java.io.*; import java.util.*; //一定要实现Serializable接口才能被序列化 public class UserInfo implements Serializable { public String userName; public String userPass; //注意,userAge变量前面的transient public transient int userAge; public UserInfo(){ } public UserInfo(String username,String userpass,int userage){ this.userName=username; this.userPass=userpass; this.userAge=userage; } public String toString(){ return "用户名: "+this.userName+";密码:"+this.userPass+ ";年龄:"+this.userAge; } }接着我们开始写如何序列化和反序列化,初学认真看哦
Java代码
import java.io.*; import java.util.*; public class Test { //序列化对象到文件 public static void serialize(String fileName){ try { //创建一个对象输出流,讲对象输出到文件 ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName)); out.writeObject("序列化日期是:"); //序列化一个字符串到文件 out.writeObject(new Date()); //序列化一个当前日期对象到文件 UserInfo user=new UserInfo("renyanwei","888888",20); out.writeObject(user); //序列化一个会员对象 out.close(); } catch (Exception x) { System.out.println(x.toString()); } } //从文件反序列化到对象 public static void deserialize(String fileName){ try { //创建一个对象输入流,从文件读取对象 ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName)); //注意读对象时必须按照序列化对象顺序读,否则会出错 //读取字符串 String today=(String)(in.readObject()); System.out.println(today); //读取日期对象 Date date=(Date)(in.readObject()); System.out.println(date.toString()); //读取UserInfo对象并调用它的toString()方法 UserInfo user=(UserInfo)(in.readObject()); System.out.println(user.toString()); in.close(); } catch (Exception x) { System.out.println(x.toString()); } } public static void main(String[] args) { serialize("D:\\test.txt"); System.out.println("序列化完毕"); deserialize("D:\\test.txt"); System.out.println("反序列化完毕"); } } import java.io.*; import java.util.*; public class Test { //序列化对象到文件 public static void serialize(String fileName){ try { //创建一个对象输出流,讲对象输出到文件 ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName)); out.writeObject("序列化日期是:"); //序列化一个字符串到文件 out.writeObject(new Date()); //序列化一个当前日期对象到文件 UserInfo user=new UserInfo("renyanwei","888888",20); out.writeObject(user); //序列化一个会员对象 out.close(); } catch (Exception x) { System.out.println(x.toString()); } } //从文件反序列化到对象 public static void deserialize(String fileName){ try { //创建一个对象输入流,从文件读取对象 ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName)); //注意读对象时必须按照序列化对象顺序读,否则会出错 //读取字符串 String today=(String)(in.readObject()); System.out.println(today); //读取日期对象 Date date=(Date)(in.readObject()); System.out.println(date.toString()); //读取UserInfo对象并调用它的toString()方法 UserInfo user=(UserInfo)(in.readObject()); System.out.println(user.toString()); in.close(); } catch (Exception x) { System.out.println(x.toString()); } } public static void main(String[] args) { serialize("D:\\test.txt"); System.out.println("序列化完毕"); deserialize("D:\\test.txt"); System.out.println("反序列化完毕"); } }运行结果:
序列化完毕
今天是:
Thu Oct 23 18:31:11 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕
我们看代码总结一下,serialize方法实现了对象的序列化功能,讲对象序列化到文件,使用了文件的输出流ObjectOutputStream 的writerObject方法一次写入一个对象,对象在文件中按写入顺序存储。
deserialize方法实现反序列化,从文件将对象反序列化到内存,使用了ObjectIntputStream 的readObject方法,因为序列化对象是按照写入顺序存储的,所以在反序列化时必须按照写入顺序读取
大家看了结果就应该知道了,标明transit的实例变量是没被序列化进去的 ,呵呵
其实序列化的意义不止如此,不但可以将对象放到文件流,还可以放到网络流里,比如我们做的Socket程序,你不但可以发送给对方一行消息,还可以发送过去一个对象,我估计QQ就不止是把我们的消息发送到对方,应该是一个对象,里面包含了发送者的信息
接下来这次我们讲的是控制对象的序列化和反序列化
控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据
我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable
Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容
好了,现在我们改写上例的UserInfo
Java代码
import java.io.*; import java.util.*; //本程序通过实现Externalizable接口控制对象序列化和反序列 public class UserInfo implements Externalizable { public String userName; public String userPass; public int userAge; public UserInfo(){ } public UserInfo(String username,String userpass,int userage){ this.userName=username; this.userPass=userpass; this.userAge=userage; } //当序列化对象时,该方法自动调用 public void writeExternal(ObjectOutput out) throws IOException{ System.out.println("现在执行序列化方法"); //可以在序列化时写非自身的变量 Date d=new Date(); out.writeObject(d); //只序列化userName,userPass变量 out.writeObject(userName); out.writeObject(userPass); } //当反序列化对象时,该方法自动调用 public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{ System.out.println("现在执行反序列化方法"); Date d=(Date)in.readObject(); System.out.println(d); this.userName=(String)in.readObject(); this.userPass=(String)in.readObject(); } public String toString(){ return "用户名: "+this.userName+";密码:"+this.userPass+ ";年龄:"+this.userAge; } } import java.io.*; import java.util.*; //本程序通过实现Externalizable接口控制对象序列化和反序列 public class UserInfo implements Externalizable { public String userName; public String userPass; public int userAge; public UserInfo(){ } public UserInfo(String username,String userpass,int userage){ this.userName=username; this.userPass=userpass; this.userAge=userage; } //当序列化对象时,该方法自动调用 public void writeExternal(ObjectOutput out) throws IOException{ System.out.println("现在执行序列化方法"); //可以在序列化时写非自身的变量 Date d=new Date(); out.writeObject(d); //只序列化userName,userPass变量 out.writeObject(userName); out.writeObject(userPass); } //当反序列化对象时,该方法自动调用 public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{ System.out.println("现在执行反序列化方法"); Date d=(Date)in.readObject(); System.out.println(d); this.userName=(String)in.readObject(); this.userPass=(String)in.readObject(); } public String toString(){ return "用户名: "+this.userName+";密码:"+this.userPass+ ";年龄:"+this.userAge; } }
改写测试类
Java代码
import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Date; import java.lang.management.*; public class Test { //序列化对象到文件 public static void serialize(String fileName){ try { //创建一个对象输出流,讲对象输出到文件 ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName)); UserInfo user=new UserInfo("renyanwei","888888",20); out.writeObject(user); //序列化一个会员对象 out.close(); } catch (Exception x) { System.out.println(x.toString()); } } //从文件反序列化到对象 public static void deserialize(String fileName){ try { //创建一个对象输入流,从文件读取对象 ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName)); //读取UserInfo对象并调用它的toString()方法 UserInfo user=(UserInfo)(in.readObject()); System.out.println(user.toString()); in.close(); } catch (Exception x) { System.out.println(x.toString()); } } public static void main(String[] args) { serialize("D:\\test.txt"); System.out.println("序列化完毕"); deserialize("D:\\test.txt"); System.out.println("反序列化完毕"); } } import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Date; import java.lang.management.*; public class Test { //序列化对象到文件 public static void serialize(String fileName){ try { //创建一个对象输出流,讲对象输出到文件 ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName)); UserInfo user=new UserInfo("renyanwei","888888",20); out.writeObject(user); //序列化一个会员对象 out.close(); } catch (Exception x) { System.out.println(x.toString()); } } //从文件反序列化到对象 public static void deserialize(String fileName){ try { //创建一个对象输入流,从文件读取对象 ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName)); //读取UserInfo对象并调用它的toString()方法 UserInfo user=(UserInfo)(in.readObject()); System.out.println(user.toString()); in.close(); } catch (Exception x) { System.out.println(x.toString()); } } public static void main(String[] args) { serialize("D:\\test.txt"); System.out.println("序列化完毕"); deserialize("D:\\test.txt"); System.out.println("反序列化完毕"); } }执行结果
现在执行序列化方法
序列化完毕
现在执行反序列化方法
Thu Oct 23 22:18:12 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕
首先,我们在序列化UserInfo对象的时候,由于这个类实现了Externalizable 接口,在writeExternal()方法里定义了哪些属性可以序列化,哪些不可以序列化,所以,对象在经过这里就把规定能被序列化的序列化保存文件,不能序列化的不处理,然后在反序列的时候自动调用readExternal()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列
发表评论
-
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
2015-03-17 11:01 1086在Java多线程应用中,队列的使用率很高,多数生产消费模型的 ... -
RabbitMQ (五)主题(Topic)
2015-02-27 17:05 0转载请标明出处:http://blog.csdn.net/l ... -
RabbitMQ (四) 路由选择 (Routing)
2015-02-27 17:04 0上一篇博客我们建立了一个简单的日志系统,我们能够广播日志消 ... -
RabbitMQ (三) 发布/订阅
2015-02-27 17:02 1204转发请标明出处:http://blog.csdn.net/l ... -
RabbitMQ (二)工作队列
2015-02-27 17:01 1231转载请标明出处:http:/ ... -
RabbitMQ 入门 Helloworld
2015-02-27 17:00 1133转载请标明出处:http://blog.csdn.net/l ... -
生成文本聚类java实现 (3)
2014-05-25 22:25 721很多网友看到我的聚类的研究,到后来基本上都是到car ... -
生成文本聚类java实现 (2)
2014-05-25 22:23 1375Java代码 4.从剩余的词中提取文本 ... -
生成文本聚类java实现 (1)
2014-05-25 22:23 1056本章主要的学习是中文分词 和两种统计词频(传统词频和T ... -
JAVA中List、Map、Set的区别与选用
2013-04-30 01:19 924类层次关系如下: Collection ├List│├L ... -
一个简单的MongoDB操作类
2013-03-15 10:04 0import java.net.UnknownHostExc ... -
Java设计模式总结
2013-02-20 23:03 0常见模式分类: 主要模式的定义和描述: ... -
mongodb——java封装(id自增,gridFS)
2013-01-30 20:08 1963/** * 数据库接口 * @author tho ... -
做MongoDB并发测试
2013-01-30 17:13 1025com.mongodb.MongoOptions源代码,其中有 ... -
【MongoDB for Java】Java操作MongoDB
2013-01-27 18:23 865上一篇文章: http://www.cnblogs.com ... -
java泛型
2012-11-30 11:21 0什么是泛型? 泛型(Generic type 或者 gen ... -
Java synchronized详解
2012-11-30 10:27 0第一篇: 使用synchronized 在编写一个类 ... -
BufferedImage与byte[]互转
2012-11-19 23:51 1243转载自:http://www.cnblogs.com/XL ... -
网络BMP图片本地保存
2012-11-19 23:50 903import java.awt.image.BufferedI ... -
图形数字的识别算法: 车牌识别及验证码识别的一般思路
2012-11-17 19:24 0图形数字的识别算法: 车牌识别及验证码识别的一般思路 本文源自 ...
相关推荐
java 对象的序列化与反序列化 java 对象的序列化与反序列化
Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化
java序列化和反序列化java序列化和反序列化java序列化和反序列化
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
java 的序列化与反序列化举例测试
java反序列化工具,覆盖jboss、weblogic、websphere。
Java Json序列化与反序列化
在应用java进行c-s开发的时候,尤其涉及到图片和视频之间的传输时,需要用序列化和反序列化技术,希望对您有帮助
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例...虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
java对象 java序列化 java反序列化
java序列化与反序列化
极好的序列化与发序列化代码。可以处理array集合,数组或者单个对象等的序列化与反序列化。
java序列化(Serializable)的作用和反序列化.doc 有详细的讲解哦。 在什么地方用的到都有说明的.
java 常用序列化和反序列化框架使用demo ,java 常用序列化和反序列化框架使用demo
Java序列化和反序列化
JAVA对象的序列化与反序列化详细PPT课件.pptx
本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自定义序列...
Serializable接口和Externalizable接口实现序列化和反序列化