39.对象序列化和反序列化

Posted luzhanshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了39.对象序列化和反序列化相关的知识,希望对你有一定的参考价值。

1.概述

技术图片

 

 

技术图片

public class Student implements Serializable {}
public class Xuliehua {
    public static void main(String[] args) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("student.txt"));
        Student stu = new Student("张飞", 18);
        objectOutputStream.writeObject(stu);
        objectOutputStream.close();
    }
}

技术图片

        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("student.txt"));
        Student student = (Student)objectInputStream.readObject();
        System.out.println(student.getName()+student.getAge());
     objectInputStream.close();

  序列化过程出现的问题及解决方法

技术图片

 

 

/**
     * 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
     * 例如我们序列化之后重新了Student类中的toString方法,我们再反序列的时候就会报错:
     * java.io.InvalidClassException:
     * IO.Student; local class incompatible:
     * stream classdesc serialVersionUID = -8962382079181361113, local class serialVersionUID = -1206037422839780297
     * 当序列化运行时检测到类中的以下问题之一时抛出InvalidClassException。√
     * 类的串行版本与从流中读取的类描述符的类型不匹配
     * 该类包含未知的数据类型
     * 该类没有可访问的无参数构造函数
     *
     * 序列化运行时与每个可序列化的类关联一个版本号,称为serialVersionUID,它在反序列化过程中使用,
     * 以验证序列化对象的发送者和接收者是否加载了与序列化兼容的对象的类。
     * 如果接收者已经为具有与对应发件人类别不同的serialVersionUID的对象加载了一个类,则反序列化将导致一个InvalidClassException 。
     * 如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据Java(TM)对象序列化规范中所述的类的各个方面计算
     * 该类的默认serialVersionUID值。 然而, 强烈建议所有可序列化的类显式声明serialVersionUID值,
     * 因为默认的serialVersionUID计算对类细节非常敏感,这些细节可能因编译器实现而异,
     * 因此可能会在反序列化期间导致意外的InvalidClassException 。
     * 因此,为了保证不同Java编译器实现之间的一致的serialVersionUID值,
     * 一个可序列化的类必须声明一个显式的serialVersionUID值。
     *
     *
     * 如果出问题了,如何解决呢?
     * 
     * 强烈建议所有可序列化的类显式声明serialVersionUID值:
     * private  static final long serialVersionUID = 42L;
     *
     *
     * 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
     * 
     * 该变量使用transient修饰即可
     * private transient int  age;
     *
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException {


//        write();
        read();
    }
    //序列化
    private static void write() throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("student.txt"));
        Student stu = new Student("张飞", 18);
        objectOutputStream.writeObject(stu);
        objectOutputStream.close();
    }
    //反序列化
    private static void read() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("student.txt"));
        Student student = (Student)objectInputStream.readObject();
        System.out.println(student.getName()+student.getAge());
        objectInputStream.close();
    }
public class Student implements Serializable {
    private  static final long serialVersionUID = 42L;
//    @Override
//    public String toString() {
//        return "Student{" +
//                "name=‘" + name + ‘‘‘ +
//                ", age=" + age +
//                ‘}‘;
//    }

    private  String name;
    private transient int  age;
}

 

以上是关于39.对象序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

序列化和反序列化

JavaScript 学习-6.对象(object)的序列化和反序列化

状态 400 和反序列化对象列表时出错。未找到默认构造函数

Python基础 -- 函数局部变量和全局变量文件(包含序列化和反序列化)异常

Java对象的序列化和反序列化

序列化和反序列化代码