java的序列化与反序列化

什么是序列化与反序列化

序列化:

        说白了,就是把一个实现了Serializable接口(只有实现了这个接口的类才能被序列化与反序列化)的类去变成本地文件保存。

反序列化:

        说白了,就是把上面保存的本地文件,一般保存为.ser后缀名的文件,通过对象输入流,给加载到内存里面去

几个与序列化、反序列化相关的对象

一、关于序列化的对象 

 

 

说明一下: 

 ObjectOutputStream,这个一般考虑为把一个对象写入到指定流里面,它的构造函数里面传递的是一个OutputSream流,也就是说,里面可以传入本地的字节输出流比如FileOutputStream,然后把这个对象写入到本地文件中。序列化就可以采用这种操作

另外就是,我们还可以把这个对象写入到ByteArrayOutputStream流中,这个对象里面维护了一个自动增长的缓冲数组。

二、关于反序列化的对象

其实就是上面介绍对象的输入流,因为要把文件输入到内存中

  

 

 说明一下:上面的ObjectInputStream对象的构造方法中,是传入一个字节输入流对象的,一般反序列化我们是从本地找文件,也就是利用FileInputStream来获取文件,然后解析。但是也可以传入一个ByteArrayInputStream流,这个里面就会传入一个之前放到ByteArrayOutputStream流中的byte数组,然后可以拿过来解析

备注:不想被序列化的属性可以用transient关键字进行修饰 

序列化与反序列化的具体操作

序列化,直接上操作代码

Serialization1.java

package pxx;

import java.io.*;

public class Serialization1 {
    public static void main(String[] args) {
        Person person = new Person("张三丰",20,180);
        //直接采用try-with-resources
        try (FileOutputStream fis = new FileOutputStream("D:\\person.ser");
             ObjectOutputStream objectOutputStream = new ObjectOutputStream(fis)){
            objectOutputStream.writeObject(person);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 现在去看在D盘生成的文件

这个文件你不用打开看,打开也看不懂,只有通过反序列化解析出来才能看

下面再来进行反序列化操作

Deserialization1.java

package pxx;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Deserialization1 {
    public static void main(String[] args) throws IOException {
        Person person = null;
        try ( FileInputStream fis = new FileInputStream("D:\\person.ser");
              ObjectInputStream objectInputStream = new ObjectInputStream(fis)){
            person = (Person)objectInputStream.readObject();
            System.out.println(person);//直接打印出来
        } catch (FileNotFoundException | ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}

 运行结果:

好了,说到这,祝早安午安晚安。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值