Java利用对象流对对象进行序列化

在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。

所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:

import java.io.*;
import java.util.*; 

public class Logon implements Serializable {

       private Date date = new Date();
       private String username;
       private transient String password;


        Logon(String name, String pwd) {
               username = name;
               password = pwd;
        }


       public String toString() {
              String pwd = (password == null ) ? "(n/a)" : password;
               return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd;
        }


        public static void main(String[] args) throws IOException , ClassNotFoundException {
              Logon a = new Logon("Morgan" , "morgan83" );
              System .out.println( "logon a = " + a);
              ObjectOutputStream o = new ObjectOutputStream ( new FileOutputStream ("Logon.out" ));
               o.writeObject(a);
               o.close();

              int seconds = 5;
              long t = System .currentTimeMillis() + seconds * 1000;
              while (System .currentTimeMillis() < t) ;

              ObjectInputStream in = new ObjectInputStream ( new FileInputStream ("Logon.out" ));
              System .out.println( "Recovering object at " + new Date());
               a = (Logon)in.readObject();
              System .out.println("logon a = " + a); 
        }
} 

 

类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这就标志着它可以被序列化。之后再main方法里ObjectOutputStream o = new ObjectOutputStream ( new FileOutputStream ("Logon.out" ));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject 开始写入。想要还原的时候也很简单ObjectInputStream in = new ObjectInputStream ( new FileInputStream ("Logon.out" ));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法就可以了。

需要说明一点,对象序列化有一个神奇之处就是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝,有关深层拷贝的问题在JavaWorld 上有一篇文章做了几种实现方法的介绍和比较,有兴趣者可以去看看。

关键字transient在这里表示当前内容将不被序列化,比如例子中的密码,需要保密,所以没有被写入文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值