可爱的静静 发表于 2017-8-31 23:54:08

java 笔记 io流-3对象序列化

本帖最后由 可爱的静静 于 2017-9-1 01:43 编辑

对象序列化对象序列化作用:把对象存到文件里,想用的时候可以读取ObjectOutputStream和ObiectInputStream是直接操作对象(对象当中会封装一些数据)的输入流和输出流,对象的持久化,可以长久存放数据的文件 ObjectOutputStream和ObiectInputStream是在io包里面的

对象序列话和反序列话例子:<div>   import java.io.*;</div><div>      public class xulie {</div><div>      public static void main(String[] args) {
      xulie a=new xulie();
         a.WritePut();
         a.read();</div><div>       }

      public voidWritePut(){
            try {
                   FileOutputStream out =new FileOutputStream("D://Student.dat");
                   ObjectOutputStream oos=new ObjectOutputStream(out);
                   Contact contact=new Contact("小明","123456789","1609368211@qq.com");
                  oos.writeObject(contact);
       oos.close();
      
         } catch (FileNotFoundException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
         } catch (IOException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
         }
      }
      public void read(){
         try {
    FileInputStream in=new FileInputStream("D://Student.dat");
    ObjectInputStream ois = null;
   ois = new ObjectInputStream(in);
    Contact contact = null;
   contact = (Contact)ois.readObject();
   System.out.println(contact);
    } catch (FileNotFoundException e) {
   e.printStackTrace();
    } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
    } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   
   }
      }
      }
</div></div>
import java.io.Serializable;
public class Contactimplements Serializable{

      private String name;
      private String phone;
      private String email;
      public Contact ( String name,String phone,String email){
                this.name=name;
                this.phone=phone;
                this.email=email;
      }
      public String toString()
      {
                return "姓名"+name+",电话:"+phone+",email:"+email;
      }
}
输出结果是:
姓名小明,电话:123456789,email:1609368211@qq.com

想要被序列化的例子必须是要有资格,只有类实现接口Serializable接口才会有资格,这个接口没有方法,只是标记这个对象可以序例化
如果每一次改变了类里面的内容,之前对象序列化的文件就没什么用,如果你重新建一个类,这就很麻烦了


怎样给这个标记可以序例化其实就是给个类加了一个ID号,例如:static final long serialVersionUID = 42L;
{:10_258:}假设已经把某类序例化了,如果某类改变了,id号就改变了,再次读取这个文件的时候就读取不了了,如果我们自己给这个类id号的话,修改了类之后id号不会改,修改之前保存的对象文件也就是可以读取了例如:刚刚已经对象序列话了,再来假设把成员name 访问方式改为public的话再读取这个文件的时候运行会有错误可以这样纸办:代码如下

import java.io.Serializable;
public class Contactimplements Serializable{

        static final long serialVersionUID = 42L;
      private String name;
      private String phone;
      private String email;
      public Contact ( String name,String phone,String email){
                this.name=name;
                this.phone=phone;
                this.email=email;
      }
      public String toString()
      {
                return "姓名"+name+",电话:"+phone+",email:"+email;
      }
}


代码改完后,先对喜爱那个序列化,再改类的内容,在读取文件,运行结果如下:姓名小明,电话:123456789,email:1609368211@qq.com
其实就是加了个ID号 无论类的代码怎么改变也好,都可以读回之前的对象序列化文件


静态的成员,即使new了一个对象赋值了,序列化也不会有改变,如果不想对非静态的成员序列化的话,可以在成员变量前面加关键字transient例如:
代码还是上面那样,transientint phone 运行结果当然那就是没有phone的值没有改变
页: [1]
查看完整版本: java 笔记 io流-3对象序列化