控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据
我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable
Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容
好了,现在我们改写上例的UserInfo
- import java.io.*;
-
import java.util.*;
-
-
-
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);
-
- 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;
}
}
改写测试类
- 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 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()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列
认真体会下程序,相信可以很快理解序列和反序列的操作,有什么没讲明白的大伙儿可以再留言和我讨论, 呵呵 一起提高
转载:http://renyanwei.iteye.com/blog/257754
分享到:
相关推荐
Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在 Java 中,序列化和反序列化是...
Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...
Java序列化是Java平台中的一种标准机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络进行传输或者在某些时候恢复原来的对象状态。这一过程包括两个主要步骤:对象的序列化(将对象转换为字节流)和反...
Protocol Buffer(简称PB)是Google开发的一种高效的数据序列化协议,而Java序列化是Java平台内置的一种序列化机制。两者的主要目标都是将对象转化为字节数组,便于在网络传输、持久化存储等场景中使用。然而,它们...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...
Java序列化是Java平台提供的一种持久化机制,它允许我们将一个Java对象转换为字节流,以便存储到磁盘上,或者通过网络进行传输。这使得我们可以保存和恢复对象的状态。实现序列化的类需要实现`Serializable`接口,...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...
Java序列化是Java平台中的一种标准机制,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在Java中,一个类如果要实现序列化,需要实现`Serializable`接口,这是一个标记接口,不包含任何方法。下面我们将...
Java序列化是Java平台中的一种标准机制,允许对象的状态被保存到磁盘或者在网络中进行传输,以便在后续的时间或地点恢复这些对象。这个过程包括两个主要操作:序列化(将对象转换为字节流)和反序列化(将字节流恢复...
Java序列化机制是Java语言中一项非常实用的功能,它极大地简化了对象在网络传输和持久化过程中的处理。通过深入了解序列化的原理和算法流程,开发者可以更好地利用这项技术解决实际问题。在未来的学习和工作中,掌握...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...
Java序列化是Java平台中的一项重要技术,它允许对象的状态被转换为字节流,以便存储或通过网络进行传输。这种技术在分布式系统、持久化存储以及数据交换等场景中非常常见。本资源包含了三个流行的Java序列化框架:...
Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...
Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在后续时间重新创建相同对象的机制。这是Java编程中一个非常重要的概念,尤其是在分布式环境和持久化存储中。让我们深入探讨一下Java...
Java序列化流协议定义了一组规则,描述了如何将Java对象转换为字节流。这些规则确保了对象可以在不同的环境中被正确序列化和反序列化。 **6.2 流元素** 序列化流由一系列元素组成,包括对象类型、对象状态等信息。...
Java序列化(Serialization)是一项重要的功能,它可以将对象的状态转化为一系列字节,从而实现对象的持久化存储或在网络上传输。序列化机制使得Java对象能够在不同的平台之间进行传输,并且能够保持其原始状态。 *...
总结来说,C#和Java的序列化和反序列化机制都是各自语言中不可或缺的一部分,它们使得数据能够在不同环境之间自由流动。理解和掌握这些技术对于任何软件开发者来说都是非常重要的,特别是涉及到数据持久化、网络通信...
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
**一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换为可以存储或传输的数据格式的过程。在Java中,通常是将对象转换为字节数组,以便写入磁盘或通过网络发送。 2. **为什么需要...