java学习之路----序列化

对象序列化就是把对象变成二进制的数据流的一种方法。通过对象的序列化可以把对象方便的存储和操作

     如果一个类想要被序列化,就必须实例化Serializable接口

          如果想要对对象进行传输,还需要用到ObjectOutputStream类和ObjectInputStream


   1。  序列化和反序列化

              把对象通过ObjectOutputStream流输出,叫序列化,而ObjectInputStream这个叫反序列化

          在程序运行的过程中,如果序列化的JDK版本和反序列化的JDK版本不统一,就容易造成异常,所以需要加一个标示,这个表示就是一个常量:SerialVersionUID,可以通过它来验证的版本的是否统一


补充:  什么是Java对象序列化

Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。

使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。

除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制,该API简单易用


2.对象输出流


          


我们来做个例子
class  Man  implements  Serializable{
       private   static   final  long   serialVersionUID  = 1583839984071561365L;

       private  String  name ;
     
       private   int   age  ;

       public  String getName() {
            return   name  ;
     }

       public   void  setName(String name) {
            this  . name  = name;
     }

       public   int  getAge() {
            return   age  ;
     }

       public   void  setAge( int  age) {
            this  . age  = age;
     }

       public  Man(String name,  int  age) {
            super  ();
            this  . name  = name;
            this  . age  = age;
     }

       @Override
       public  String toString() {
     
            return   "姓名"  +  this .  name +  "年龄" +  this  . age  ;
     }

     
     
}
     

public   class  SerDemo {
     
       public   static   void  main(String[] args)  throws  Exception {
          Man p=  new  Man( "like"  ,30);
          ObjectOutputStream oop=  new  ObjectOutputStream( new  FileOutputStream(  new  File( "f:"  +File. separator  + "a.txt"  )));
          oop.writeObject(p);
          oop.close();
          
     }

}

打开a.txtx,你会看到全是乱码,这是因为存储的是二进制数据。。。

序列化只序列化了对象的属性

3.反序列化

           public   class  SerDemo1 {
       public   static   void  main(String[] args)  throws  Exception {
              File f=  new  File( "f:"  +File. separator  + "a.txt"  );
              
              ObjectInputStream ois=  new  ObjectInputStream( new  FileInputStream(f));
              Object obj=ois. readObject();
              ois.close();
              System.  out  .println(obj);
     }

}
结果:
姓名like年龄30

补充:如果在序列化的时候,某个属性不想被序列化,可以使用transient关键字声明
例如:

     private transient String name;
那么这个属性就不会被序列化



          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值