序列化和反序列化的使用细节

        在使用序列化和反序列化的过程中我们需要注意一些小细节

1.假设我们先用序列化把对象写到本地文件当中

import java.io.Serializable;

public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private int num;


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    public String toString() {
        return "Student{name=" + name + ", age = " + age + "}";
    }
}
public class ObjectStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("\\myio\\f.txt"));
        Student o = (Student) ois.readObject();
        System.out.println(o);
        ois.close();
    }
}

2.然后第二步,我们在Javabean当中对Student类进行一个修改

        比如说加上一个属性private int num 表示学生的学号

    private String name;
    private int age;
    private int num;

3.在使用反序列化将对象读取到内存当中

结果你发现他报错了,原因如下:

        如果一个类实现了Serializable接口,那就表示这个类的对象是可被序列化的,那么Java的底层会根据这个类的成员变量、静态变量、构造方法、成员方法等进行计算,得出一个long类型的序列号,那么此时我们在创建一个对象的时候,在对象里面就包含了序列号,用序列化写到本地文件中的时候,也会把序列号写到文件当中,但是如果此时你修改了Javabean类中的代码,那么Java底层会重新计算出一个序列号,当我们用反序列化把对象读取到内存中之后就会发现两个序列号不一样,代码直接报错。简单来说就是文件中的序列号和Javabean的序列号不匹配导致的。

解决方案:固定序列号

        在最上面定义Javabean类的时候,手动的把序列号先定义出来

    private static final long serialVersionUID = 1L;

重新运行后,打印出

补充:

transient:瞬态关键字

作用:不会把当前属性序列化到本地文件当中

 

 序列化后进行反序列化打印时发现

age为初始值 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值