在JAVA中,一个大的应用程序需要保存很多对象的时候,由于虚拟机内存有限,(资源宝贵啊
)有时不可能所有有用的对象都放到内存中,因此,需要将不常用的对象暂时持久化的文件中,当需要这个对象时,再从文件把对象恢复到内存中,这就是所谓对象的序列化和反序列化。本文讲实现如何将对象序列化到文件,然后再从文件反序列化到对象,你会发现其实特别简单
先看一下对象的序列化和反序列化的关键是什么
1,首先被序列化的对象必须实现 java.io.Serializable
接口,咳~~咳~~,其实这个接口没定义任何方法
2,序列化时,需要用到对象输出流ObjectOutputStream
,然后通过文件输出流构造
ObjectOutputStream
对象调用writeObject写入到文件
3,反之,反序列化时用到对象输入流ObjectIntputStream, 然后通过文件输出流构造
ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型
4,注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量)
5,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错
好了,现在我们做一个实例,我们现在要序列化一个会员对象到文件里,然后再把它读出来
先创建会员类
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.*;
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就不止是把我们的消息发送到对方,应该是一个对象,里面包含了发送者的信息什么的。呵呵 有兴趣的可以做一下哈
分享到:
相关推荐
XML序列化/反序列化类,放到项目中直接使用,很方便。 SerializationHelper
Java反序列化漏洞利用工具
一个基于VS2005的序列化、反序列化的例子,自己编写的,主要用C++面向对象的思想实现的。仅供参考!
Java反序列化终极测试工具
Java反序列化漏洞检查工具V1.2_Weblogic XML反序列化漏洞检查工具CVE-2017-10271
java反序列化终极工具,含有JBoss,websphere,weblogic等反序列化漏洞利用。
.net 将dataset json序列化和反序列化成dataset JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - ...
Java反序列化漏洞探析及其修复方法研究.pdf
Java反序列化终极测试工具(里面有两款)
C#序列化与反序列化类-源代码,支持将类和任何C#对象序列化到文件
Qt 序列化函数和反序列化函数
Rust 字节流序列化/反序列化库
java反序列化漏洞利用工具包含jboss|weblogic,网上其实有很多,但是用别人的工具收30分是不是有点不厚道,所以我用自己的分下载下来,然后以最低分贡献给大家,上次没有审核通过,希望这次可以
检测javaRMI反序列化漏洞
java反序列化工具;weblogic反序列化工具;jboss反序列化工具。
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
java反序列化漏洞-验证jar