java对象序列化与反序列化

java序列化与反序列化也是IO中比较重要的一部分,序列化是指将java对象转化成二进制形式输出,反序列化顾名思义就是将二进制流再转为对象的过程。

在java中使用java对象流来进行对象的序列化和反序列化;

ObjectOutputStream:通过 writeObject()方法做序列化操作

ObjectInputStream:通过 readObject() 方法做反序列化操作

第一步:创建一个javaBean对象

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public class Person implements Serializable{

    private String name;

    private int 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 + "]";

    }

    public Person(String name, int age) {

        super();

        this.name = name;

        this.age = age;

    }

}  

 第二步:使用ObjectOutPutStream对象实现序列化

1

2

3

4

5

6

//在根目录下新建一个 io 的文件夹

        OutputStream op = new FileOutputStream("io"+File.separator+"a.txt");

        ObjectOutputStream ops = new ObjectOutputStream(op);

        ops.writeObject(new Person("vae",1));

         

        ops.close();

运行代码后,打开a.txt文档会发现文档里边的内容是乱码的,并不是说程序出错了,而是因为这是二进制文件。

第三步:使用ObjectInputStream 对象实现反序列化

  反序列化的对象必须要提供该对象的字节码文件.class

1

2

3

4

5

6

7

InputStream in = new FileInputStream("io"+File.separator+"a.txt");

        ObjectInputStream os = new ObjectInputStream(in);

        byte[] buffer = new byte[10];

        int len = -1;

        Person p = (Person) os.readObject();

        System.out.println(p);  //Person [name=vae, age=1]

        os.close();

问题1:如果某些数据不需要做序列化,比如密码,比如上面的年龄?

解决办法:在字段面前加上 transient,那么我们在反序列化的时候,打印出来的就是Person [name=vae, age=0],整型数据默认值为 0 

1

2

private String name;//需要序列化

    transient private int age;//不需要序列

问题2:序列化版本问题,在完成序列化操作后,由于项目的升级或修改,可能我们会对序列化对象进行修改,比如增加某个字段,那么我们在进行反序列化就会报错,这时只需要在对象类里边加上一个系列化版本号字段即可;

解决办法:在 JavaBean 对象中增加一个 serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值