- 浏览: 331206 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
longge424:
你好,可否将saml与spring security结合使用的 ...
SAML介绍 -
bnmnba:
mark
(转)Ant 学习笔记(一) -
redhacker:
写的还不错!谢谢!
SAML介绍 -
linluxian:
SAML介绍 -
hyj1254:
有效,good.
Linux创建目录与删除目录命令具体分析
基本概念:
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
昨天在一本书上看到了,好好实践了一下,序列化为一般文件,也序列化为XML文件(使用XStream)。
用于序列化的实体类Person.java 代码如下(记得需要实现Serializable接口):
import java.io.Serializable; @SuppressWarnings("serial") public class Person implements Serializable{ private String name; private int age; public Person(){ } public Person(String str, int n){ System.out.println("Inside Person's Constructor"); name = str; age = n; } String getName(){ return name; } int getAge(){ return age; } }
序列化、反序列化为一般的文件,SerializeToFlatFile.java类的代码如下:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializeToFlatFile { public static void main(String[] args) { SerializeToFlatFile ser = new SerializeToFlatFile(); ser.savePerson(); ser.restorePerson(); } public void savePerson(){ Person myPerson = new Person("Jay",24); try { FileOutputStream fos = new FileOutputStream("E:\\workspace\\2010_03\\src\\myPerson.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); System.out.println("Person--Jay,24---Written"); System.out.println("Name is: "+myPerson.getName()); System.out.println("Age is: "+myPerson.getAge()); oos.writeObject(myPerson); oos.flush(); oos.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public void restorePerson() { try { FileInputStream fis = new FileInputStream("E:\\workspace\\2010_03\\src\\myPerson.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Person myPerson = (Person)ois.readObject(); System.out.println("\n--------------------\n"); System.out.println("Person--Jay,24---Restored"); System.out.println("Name is: "+myPerson.getName()); System.out.println("Age is: "+myPerson.getAge()); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
运行结果为(console输出),当然可以查看到myPerson.txt文件已经生成:
Inside Person's Constructor
Person--Jay,24---Written
Name is: Jay
Age is: 24
--------------------
Person--Jay,24---Restored
Name is: Jay
Age is: 24
序列化、反序列化为XML文件,我使用了XStream来序列化,需要引入xstream-1.3.1.jar包的支持,
http://xstream.codehaus.org/download.html 处可以下载jar,然后引入到Eclipse中的build path中。
Serialize.java的代码如下:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import com.thoughtworks.xstream.*; public class Serialize { public static void main(String[] args) { Serialize ser = new Serialize(); ser.serializeToXml(); ser.deSerializeFromXml(); } public void serializeToXml(){ Person[] myPerson = new Person[2]; myPerson[0] = new Person("Jay",24); myPerson[1] = new Person("Tom",23); XStream xstream = new XStream(); try { FileOutputStream fos = new FileOutputStream("E:\\workspace\\2010_03\\src\\myPerson.xml"); xstream.toXML(myPerson,fos); } catch (FileNotFoundException ex) { ex.printStackTrace(); } System.out.println(xstream.toXML(myPerson)); } public void deSerializeFromXml(){ XStream xs = new XStream(); Person[] myPerson = null; try { FileInputStream fis = new FileInputStream("E:\\workspace\\2010_03\\src\\myPerson.xml"); myPerson=(Person[])xs.fromXML(fis); if (myPerson != null) { int len = myPerson.length; for (int i=0;i<len;i++) { System.out.println(myPerson[i].getName()); System.out.println(myPerson[i].getAge()); } } } catch (FileNotFoundException ex) { ex.printStackTrace(); } } }
运行结果为(console输出),当然可以查看到myPerson.xml文件已经生成:
Inside Person's Constructor
Inside Person's Constructor
<Person-array>
<Person>
<name>Jay</name>
<age>24</age>
</Person>
<Person>
<name>Tom</name>
<age>23</age>
</Person>
</Person-array>
Jay
24
Tom
23
参考资料:
http://developer.51cto.com/art/200908/147650.htm
http://www.ibm.com/developerworks/cn/xml/x-xstream/#resources
http://www.cnblogs.com/stephencat/archive/2007/06/05/772520.html
转载:http://renyongjie668.blog.163.com/blog/static/1600531201022105142865/
这次我们讲的是控制对象的序列化和反序列化
控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据
我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable
Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容
好了,现在我们改写上例的UserInfo
- 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.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()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列
发表评论
-
maven+springMVC+mybatis+junit详细搭建过程(转)
2015-06-01 09:46 3589目录[-] springMVC+mybatis框 ... -
linux awk的使用详解(收藏)
2014-09-03 16:04 705简介 awk是一个强大的文本分析工具,相对于grep的查 ... -
JSP中文乱码的产生原因及解决方案-转
2013-05-15 17:33 2401JSP中文乱码的产生原因及解决方案在JSP的开发过程中,经常 ... -
SAML介绍
2013-03-25 21:03 4422工作了一段时间,接触到不少知识,好久没有进行总 ... -
linux下通过JNI用C/C++中调用JAVA类
2012-07-20 16:15 1775最近工作中完成 ... -
逆向工程中的问题:Hibernate project not selected 解决方式(转)
2012-03-14 10:43 2183今天用myeclipse自动生成POJO类时一直找不到java ... -
责任链模式(转)
2011-11-22 21:38 1088责任链模式是一种对象的行为模式。 在责任链模 ... -
java动态代理--JDK
2011-10-30 18:04 930JAVA的动态代理 代理模式 代理模式是常用的java ... -
Hibernate的merge与update方法的区别
2011-09-20 22:47 975今天做了个测试,写了个测试用例来看看merge与update时 ... -
Hibernate学习:Transient、Persistent、Detached三个状态
2011-09-19 22:15 1438Transient、Persistent、Detached是H ... -
sping源码分析之properties操作(转载) .
2011-09-15 14:36 1179目前在开发的过程中遇到:通过spring在后台对前台 ... -
Annotation 介绍
2011-07-07 10:29 1213从JDK5开始提供名为Annotation(注释)的功能,它被 ... -
java子类对象的初始化过程(转)
2010-12-13 10:28 1055具体的顺序如下: ... -
策略模式学习
2010-12-09 22:27 991一个策略模式的加减乘除: 抽象策略角色: (精囊妙计) ... -
代理模式学习
2010-12-09 22:22 848代理模式所涉及的角色有: 抽象主题角色:声明了真实主题 ... -
关于内部类的总结(转)
2010-11-17 14:56 870内部类: 1,概述内部类是指在一个外部类的内部再定义一个 ... -
Java关键字final、static使用总结(转载)
2010-11-16 23:16 926一、final 根据程序上 ... -
关于abstrat类的一些问题总结
2010-11-16 23:10 1168最近遇到了一些关于抽 ... -
Java NIO与IO的区别和比较(转)
2010-11-14 20:05 1581导读J2SE1.4以上版本中发布了全新的I/O类库 ... -
关于socket中的长连接与短连接
2010-11-14 19:41 42941.长连接 Client方与Server方先建立通讯连接,连接 ...
相关推荐
java序列化与反序列化
### Java序列化与反序列化的深入解析 #### Java序列化的重要性及应用场景 Java序列化是一项核心功能,它允许程序员将对象的状态转化为字节流的形式,从而实现对象的持久化存储或者在网络之间进行传递。这对于诸如...
Java序列化与反序列化是Java编程中一个重要的概念,它允许我们将对象的状态转换为字节流,以便存储或在网络中传输。这个过程被称为序列化,而将字节流恢复为对象的过程则称为反序列化。Java提供了一个内置的机制来...
### Java序列化与反序列化详解 #### 一、Java序列化概述 Java序列化(Serialization)是一项重要的功能,它可以将对象的状态转化为一系列字节,从而实现对象的持久化存储或在网络上传输。序列化机制使得Java对象...
java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在...
Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...
### Java序列化与反序列化的深入解析 #### 序列化的功能与意义 序列化是Java编程语言中的一项核心功能,其主要目的是将对象的状态转换为可以存储或传输的格式,便于持久化保存或网络传输。序列化并不涉及对象的...
java 序列化与反序列化的实例详解 Java 序列化与反序列化是 Java 编程语言中的一种机制,允许将 Java 对象转换为字节序列,并将其反序列化回 Java 对象。序列化是指将 Java 对象转换为字节序列的过程,而反序列化是...
Java的序列化与反序列化是Java开发中的一项重要技术,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。`Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
本篇文章将深入探讨C#和Java中的序列化与反序列化机制。 首先,我们要了解什么是序列化。序列化是指将对象的状态转化为可存储或可传输的数据格式的过程。这个过程通常将内存中的对象转换成字节流,以便保存到磁盘、...
Java中的JSON(JavaScript Object Notation)序列化与反序列化是开发过程中常见且重要的操作,主要用于数据交换和存储。JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在...
Java 序列化与反序列化(Serialization)知识点总结 Java 序列化与反序列化是 Java 语言中的一种机制,用于将对象的状态信息转化为可以存储或者传输的形式的过程。序列化(Serialization)是将对象的状态信息转化为...
以下是一段典型的序列化与反序列化的示例代码: ```java package com.hotye.dchaoxiong.serializabletest; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; ...