JAVA对象序列化

JAVA对象序列化流

对象序列化:将对象保存到磁盘中,或者在网络中传输对象。其使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息。
字节序列写到文件之后,相当于在文件中持久保存了一个对象的信息。该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。

要实现序列化和反序列化就要使用对象系列化流和对象反序列化流:

  • 对象序列化流: ObjectInputStream
  • 对象反序列化流: ObjectOutputStream
使用案例:
  1. 序列化对象,首先需要创建对象,并且该对象需要实现Serializable接口
import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private int age;

    public Person() {
    }

    public Person(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;
    }
    
	@Override
	    public String toString() {
	        return "Person{" +
	                "name='" + name + '\'' +
	                ", age=" + age +
	                '}';
	    }
}
  1. 对象序列化和反序列化操作。
import java.io.*;
import java.text.ParseException;

public class test2 {
    public static void main(String[] args) throws ParseException, IOException, ClassNotFoundException {
        // 1. 对象序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("person.txt"));
        Person p = new Person("张三",40);
        //序列化对象
        objectOutputStream.writeObject(p);
        // 释放资源
        objectOutputStream.close();

        // 2.对象反序列化流
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("person.txt"));
        // 反序列化对象,默认返回的对象为Object,即所有对象的父类
        Object o = objectInputStream.readObject();
        // 向下转型
        Person pp = (Person) o;
        System.out.println(pp);

        objectInputStream.close();
    }
}
注意事项
1.用对象序列化流序列化一个对象到文件之后,如果修改了对象所属的类文件,进行对象反序列化会发生问题,以及解决方法。

当我们将Person对象序列化到文件之后,修改了Person类,比如增加了一个成员变量,或者增加了一个方法,此时如果要对持久化的对象进行反序列化,则会抛出java.io.InvalidClassException

问题的原因在于:类的串行版本与从流中读取的类描述符的类型不匹配。也就是在对Person类未修改前其有一个序列化版本号,在对类进行修改之后,其序列化版本号发生了改变,则会导致对象反序列化失败,具体见下图:
在这里插入图片描述
用对象序列化流序列化一个对象到文件之后,如果修改了对象所属的类文件,也要对对象进行反序列化,为保证不发生问题,则需要在对象的类文件内部添加如下代码:(serialVersionUID为自己指定的值)

    private static final long serialVersionUID = 11333L;
2.如果一个对象中的某个成员变量不想被序列化。

给对象中不想被序列化的成员变量加关键字 transient即可。
比如不想序列化Person中的age,则:

private transient int age;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山风wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值