码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-06-25 14:14:40      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:匹配   bsp   反序列化   string   color   src   alt   info   ret   

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.对象序列化和反序列化

标签:匹配   bsp   反序列化   string   color   src   alt   info   ret   

原文地址:https://www.cnblogs.com/luzhanshi/p/13191495.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!