Java学习:序列化和反序列化


Java学习:序列化和反序列化

  • Java序列化:定义

    • Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列

    • 该字节序列包括该对象的数据,有关对象的类型的信息和存储在对象中数据的类型;

    • 将序列化对象写入文件后,可以从文件中读取出来,并且对它进行反序列化;

    • 也就是说,对象的类型信息,对象的数据,还有对象中的数据类型可以用来在内存中新建对象;

       

    • 整个过程都是Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象;

    • 类ObjectInputStream和ObjectOutputStream是高层次的数据流:它们包含反序列化和序列化对象的方法;

 

  • Java序列化:语法

    //java序列化:语法
    public final void writeObject(Object x) throws IOException;
    ?
    //Java反序列化:语法
    public final Object readObject() throws IOException,ClassNotFoundException;
    ?

     

  • 代码案例:对象序列化

    ?
    /**
    * 序列化对象:writeObject(Object);
      程序-->文件
    *
    * ObjectInputStream
    * objectOutputStream
    *
    */
    public class Demo24 {
       public static void main(String[] args) {
           Person person=new Person();
           person.setAge(12);
           person.setName("haha");
    ?
           try {
               ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("E:/haha/demo1.txt"));
               //序列化,对象写到文件
               oos.writeObject(person);
               System.out.println("over:序列化成功");
               oos.close();
    ?
          } catch (IOException e) {
               e.printStackTrace();
          }
    ?
      }
    }
    ?
    ?
  • 代码案例:ObjectInputStream 类:readObject():

    ?
    /**
    * ObjectInputStream 类:readObject():
    * 反序列化:用对象接收
    */
    public class Demo25 {
       public static void main(String[] args) {
           Person person=new Person();
    ?
           //反序列化
           try {
               ObjectInputStream ois=new ObjectInputStream(new FileInputStream("E:/haha/demo1.txt"));
    ?
               person=(Person) ois.readObject();
               System.out.println(person.getAge());//12
               System.out.println(person.getName());//haha
    ?
               //关闭流
               ois.close();
    ?
          } catch (IOException e) {
               e.printStackTrace();
          }catch (ClassNotFoundException e){
               e.printStackTrace();
          }
    ?
    ?
      }
    }
    ?
    ?
  • 基础类:

    /**
    笔记:定义要实现接口:Serializable;否则会报错;
    */
    ?
    public class Person implements java.io.Serializable{
    ?
       private String name;
       private int age;
    ?
    ?
       //get
       public String getName(){
           return name;
      }
    ?
       //set
       public void setName(String name){
           this.name=name;
      }
    ?
       public int getAge() {
           return age;
      }
    ?
       public void setAge(int age) {
           this.age = age;
      }
    ?
    }