Chinaunix首页 | 论坛 | 博客
  • 博客访问: 823804
  • 博文数量: 247
  • 博客积分: 166
  • 博客等级: 入伍新兵
  • 技术积分: 2199
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-15 16:10
文章分类

全部博文(247)

文章存档

2017年(1)

2015年(63)

2014年(80)

2013年(94)

2012年(9)

分类: Java

2014-11-10 17:13:06

基本概念:
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,现在我们还有一种灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据。

我们现在来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable

Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容


点击(此处)折叠或打开

  1. import java.io.*;
  2. import java.util.*;
  3.   
  4. //本程序通过实现Externalizable接口控制对象序列化和反序列
  5. public class UserInfo implements Externalizable {
  6.     public String userName;
  7.     public String userPass;
  8.     public int userAge;
  9.   
  10.     public UserInfo(){
  11.     }
  12.   
  13.     public UserInfo(String username,String userpass,int userage){
  14.         this.userName=username;
  15.         this.userPass=userpass;
  16.         this.userAge=userage;
  17.     }
  18.        
  19.     //当序列化对象时,该方法自动调用
  20.     public void writeExternal(ObjectOutput out) throws IOException{
  21.         System.out.println("现在执行序列化方法");
  22.         //可以在序列化时写非自身的变量
  23.         Date d=new Date();
  24.         out.writeObject(d);
  25.         //只序列化userName,userPass变量
  26.         out.writeObject(userName);
  27.         out.writeObject(userPass);
  28.     }
  29.   
  30.     //当反序列化对象时,该方法自动调用
  31.     public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{
  32.         System.out.println("现在执行反序列化方法");
  33.         Date d=(Date)in.readObject();
  34.         System.out.println(d);
  35.         this.userName=(String)in.readObject();
  36.         this.userPass=(String)in.readObject();
  37.     }
  38.   
  39.     public String toString(){
  40.         return "用户名: "+this.userName+";密码:"+this.userPass+
  41.             ";年龄:"+this.userAge;
  42.     }
  43. }


改写测试类


点击(此处)折叠或打开

  1. import java.io.ObjectOutputStream;
  2. import java.io.ObjectInputStream;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.util.Date;
  6. import java.lang.management.*;
  7. public class Test {
  8.   
  9.   
  10.   
  11.     //序列化对象到文件
  12.     public static void serialize(String fileName){
  13.         try
  14.         {
  15.             //创建一个对象输出流,讲对象输出到文件
  16.             ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));
  17.   
  18.             UserInfo user=new UserInfo("renyanwei","888888",20);
  19.             out.writeObject(user); //序列化一个会员对象
  20.   
  21.             out.close();
  22.         }
  23.         catch (Exception x)
  24.         {
  25.             System.out.println(x.toString());
  26.         }
  27.            
  28.     }
  29.     //从文件反序列化到对象
  30.     public static void deserialize(String fileName){
  31.         try
  32.         {
  33.             //创建一个对象输入流,从文件读取对象
  34.             ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));
  35.   
  36.             //读取UserInfo对象并调用它的toString()方法
  37.             UserInfo user=(UserInfo)(in.readObject());
  38.             System.out.println(user.toString());
  39.   
  40.             in.close();
  41.         }
  42.         catch (Exception x)
  43.         {
  44.             System.out.println(x.toString());
  45.         }
  46.            
  47.     }
  48.   
  49.     public static void main(String[] args) {
  50.   
  51.         serialize("D:\\test.txt");
  52.         System.out.println("序列化完毕");
  53.            
  54.         deserialize("D:\\test.txt");
  55.         System.out.println("反序列化完毕");
  56.     }
  57.   
  58. }


 执行结果

现在执行序列化方法
序列化完毕
现在执行反序列化方法
Thu Oct 23 22:18:12 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕

通过一张图来看程序流程

首先,我们在序列化UserInfo对象的时候,由于这个类实现了Externalizable 接口,在writeExternal()方法里定义了哪些属性可以序列化,哪些不可以序列化,所以,对象在经过这里就把规定能被序列化的序列化保存文件,不能序列化的不处理,然后在反序列的时候自动调用readExternal()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列


阅读(820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~