zoukankan      html  css  js  c++  java
  • java中的序列化流和反序列化流

    序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。    对象 -- 流数据(ObjectOutputStream)

    反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)

    序列化流和反序列化流不同于字节流 字符流 内存字节流,这些都是把字符串写入/读取文件,序列化流和反序列化流可以将对象写入/读取文本文件中.

    但是我们要注意的是,写入和读取的文件要实现Serializable这个接口,当然这个接口是没有任何方法的,直接implements就好,类似于这种没有任何方法的接口被称为标记接口.

    可是当我们对原有的对象中的数据改变了之后,直接读取(不写入,在实际开发中不能每改一次就写入一次),就会报错:

     

     

    java.io.InvalidClassException: DemoPerson; local class incompatible: stream classdesc serialVersionUID = -2071565876962058344,  local class serialVersionUID = -8345153069362641443

    这是因为对象类实现Serializable就会有一个id值,当改变对象中的数据时,这个id值会发生改变,但是文本文件中的写入和读取的id还是以前的id值,造成id值不匹配,就会报错,解决办法:对象类中会报一个黄色的警告,点击这个警告按照编译器实现就行.

    附代码:

    Person

     1 public class Person implements Serializable {
     2     private static final long serialVersionUID = -2071565876962058344L;
     3 
     4     private String name;
     5 
     6     // private int age;
     7 
     8     private transient int age;
     9 
    10     // int age;
    11 
    12     public Person() {
    13         super();
    14     }
    15 
    16     public Person(String name, int age) {
    17         super();
    18         this.name = name;
    19         this.age = age;
    20     }
    21 
    22     public String getName() {
    23         return name;
    24     }
    25 
    26     public void setName(String name) {
    27         this.name = name;
    28     }
    29 
    30     public int getAge() {
    31         return age;
    32     }
    33 
    34     public void setAge(int age) {
    35         this.age = age;
    36     }
    37 
    38     @Override
    39     public String toString() {
    40         return "Person [name=" + name + ", age=" + age + "]";
    41     }
    42 }

    ObjectStreamDemo

     1 import java.io.FileInputStream;
     2 import java.io.FileOutputStream;
     3 import java.io.IOException;
     4 import java.io.ObjectInputStream;
     5 import java.io.ObjectOutputStream;
     6 
     7 public class ObjectStreamDemo {
     8     public static void main(String[] args) throws IOException, ClassNotFoundException {
     9 //        write();
    10         
    11         read();
    12     }
    13 
    14     private static void read() throws IOException, ClassNotFoundException {
    15         //反序列化对象
    16         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oss.txt"));
    17         //接收对象是Object
    18         Object ob = ois.readObject();
    19         
    20         ois.close();
    21         
    22         System.out.println(ob);
    23     }
    24 
    25     private static void write() throws IOException {
    26         //创建序列化输出流
    27         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oss.txt"));
    28         
    29         Person p = new Person("熊大", 16);
    30         
    31         oos.writeObject(p);
    32         
    33         oos.close();
    34     }
    35 }

     

     

  • 相关阅读:
    B. Spreadsheets
    Frequent values 倍增/线段树离散化
    E. Tree Painting 二次扫描换根法
    1405 树的距离之和 二次扫描换根法
    D. Subarray Sorting
    K
    Max answer(单调栈,rmq)
    POJ2823 (单调队列)
    POJ2559(单调栈入门)
    Principles and strategies for mathematics study
  • 原文地址:https://www.cnblogs.com/losedMemory/p/6159264.html
Copyright © 2011-2022 走看看