zoukankan      html  css  js  c++  java
  • Java IO流-序列化流和反序列化流

    2017-11-05 20:42:06

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

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

    • ObjectOutputStream

    ObjectOutputStreamObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream(反序列化) 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

    注意:要被序列化的类需要实现Serializable接口,否则就不能进行序列化,但是这个类是个标记接口,就是没有需要重写的方法。

    *构造方法

    *常用方法

     

    • ObjectInputStream

    ObjectInputStreamObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

    ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。

    *构造方法

    *常用方法

    import java.io.*;
    
    public class Demo5 {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            //write();
            read();
        }
    
        public static void write()throws IOException{
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:/test.txt"));
    
            // 类需要有序列化接口才能被序列化
            Student st = new Student("张三",20);
    
            // 序列化
            oos.writeObject(st);
    
            oos.close();
        }
    
        public static void read() throws IOException, ClassNotFoundException {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:/test.txt"));
    
            //反序列化
            Object obj = ois.readObject();
    
            ois.close();
    
            //输出对象
            System.out.println(obj);
    
        }
    }
    
    
    
    
    import java.io.Serializable;
    
    public class Student implements Serializable{
        private String name;
        private Integer age;
    
        Student(String name,int age)
        {
            this.name=name;
            this.age=age;
        }
    
    }
    

    问题一、如果在读取之前修改了Student类那么在read()函数的执行过程中会产生一个错误:

    Exception in thread "main" java.io.InvalidClassException:
    DemoFile.Student; local class incompatible:
    stream classdesc serialVersionUID = -8639914051049964771, 
    local class serialVersionUID = -7579084536321238113
    

    原因是:由于Student类实现了序列化接口,所以会生成一个序列化的标记值,但是如果你修改了Student类,那么这个序列化值就会发生变化。在读取的时候会发现序列化值不匹配的问题,就会报错。

    解决方法就是是这个序列号变成常量,这样的化,我们在修改类后,它的数据读取就不会产生上述的问题。

    public class Student implements Serializable{
    
        private static final long serialVersionUID = -7579084536321238113L;
    
        private String name;
        private int age;
        // int age;
    
        Student(String name,int age)
        {
            this.name=name;
            this.age=age;
        }
    
    }
    

    问题二:类中的成员变量不被序列化的方法 : 加上 transient 关键字。

  • 相关阅读:
    [Kotlin] Open Classes and Inheritance
    [Kotlin] Class
    [Kotlin] Reverse a List with downTo
    [Kotlin] Named loop
    [Kotlin] for loop
    [Kotlin] Array List ArrayList
    深度解读 java 线程池设计思想及源码实现
    源码实战 | 从线程池理论聊聊为什么要看源码
    自己实现一个简单的线程池
    死磕 java线程系列之自己动手写一个线程池(续)
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/7788915.html
Copyright © 2011-2022 走看看