Serializable序列化

对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) 。
Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时,只是表明该类参加串行化协议,而不需要实现任何特殊的方法。
要串行化一个对象,必须与一定的对象输出/输入流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
 java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象 。在ObjectInputStream 中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。
串行化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。如果不希望保存某个变量,只需在前面加上关键字transient。
什么情况下需要序列化
1、当你想把的内存中的对象状态保存到一个文件中或者数据库中时候(方便以后读取)

2、当你想用套接字在网络上传送对象的时候

3、当你想通过Java远程方法调用(Java Remote Method Invocation)传输对象的时候

下面例子把对象保存到文件,然后再从文件中读取对象

public class LoginInfo implements Serializable{

   String name;

   transient String passWord;

   static String testStatic;

   public LoginInfo(String name,String passWord,String testStatic){

      this.name = name;

      this.passWord = passWord;

      this.testStatic = testStatic;

   }

   public String get(){

      return name+passWord+testStatic;

   }

}

public class TestSave {

   public static void main(String[]args) throws Exception{

      LoginInfo loginInfo = new LoginInfo("wdy1""password1""sss1");

      FileOutputStream fo = new FileOutputStream("data.ser");

      ObjectOutputStream so = new ObjectOutputStream(fo);

      so.writeObject(loginInfo);

      loginInfo = new LoginInfo("wdy2""password2""sss1");

      so.writeObject(loginInfo);

      so.writeObject(null);

      so.close();

   }

}

public class TestRead {

   public static void main(String[]args) throws Exception{

      FileInputStream fi = new FileInputStream("data.ser");

      ObjectInputStream si = new ObjectInputStream(fi);

      LoginInfo loginInfo = null;

      while((loginInfo = (LoginInfo)si.readObject())!=null){

         System.out.println(loginInfo.name);

         System.out.println(loginInfo.passWord);

         System.out.println(loginInfo.testStatic);

         System.out.println(loginInfo.get());

      }

      si.close();

   }

}

输出结果:
wdy1
null
null
wdy1nullnull
wdy2
null
null
wdy2nullnull
可见,静态变量和 transient修饰的变量不被保存

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/u/1987489/blog/491316

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值