IO系列之对象序列化

1. 对象序列化介绍

对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流,都可以将这种二进制流恢复成原来的Java对象。 简单来讲,对象序列化就是将内存中的对象数据转换为二进制流进行传输的操作。

对象序列化机制(object serialization)是Java语言内建的一种对象持久化方式,通过对象序列化,可以把对象保存为字节数组,这些字节数组可以保存在磁盘上,或通过网络传输。在有需要的时候将这个字节数组通过反序列化的方式再转换成对象。对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。

在Java中,对象的序列化与反序列化被广泛应用到RMI(远程方法调用)及网络传输中。通常建议:程序创建的每个JavaBean类都实现Serializable

2. java提供的序列化支持

Java为了方便开发人员将Java对象进行序列化及反序列化提供了一套方便的API来支持。其中包括以下接口和类:

java.io.Serializable

java.io.Externalizable

ObjectOutput

ObjectInput

ObjectOutputStream

ObjectInputStream

要想序列化必须实现java.io.Serializable 接口,未实现此接口的类将无法使其任何状态序列化或反序列化。java.io.Serializable是一种标识接口,表示一种能力,本身没有任何方法。

  • 序列化类:java.io.ObjectOutputStream,将对象变为指定格式的二进制数据
  • 反序列化类:java.io.ObjectInputStream,可以将序列化的对象转换为对象内容
3. Transient 关键字

Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。Transient关键字只能用于修饰Field,不可修饰Java程序中的其他成分。

4. 通过代码实现序列化与反序列化
  1. 首先实现Serializable接口
/**
 * @author zhaojiaxing
 * @date 2020-02-01 21:25
 */
public class Book implements Serializable {

    private String title;

    private double price;

    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }

    @Override
    public String toString() {
        return "SerializableTest{" +
                "title='" + title + '\'' +
                ", price=" + price +
                '}';
    }
}
  1. 将book对象序列化
 /**
     * 序列化
     * @throws Exception
     */
    public static void ser() throws Exception{
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
                new File("E:\\demo\\book.txt")));
        //序列化对象
        oos.writeObject(new Book("java编程思想",121));
        oos.close();
    }
  1. 将序列化到磁盘的二进制文件进行反序列化为对象
 /**
     * 反序列化
     * @throws Exception
     */
    public static void dser() throws Exception{
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(
                new File("E:\\demo\\book.txt")
        ));
        //反序列化
        Object obj = inputStream.readObject();

        Book book = (Book)obj;
        System.out.println(book);

        inputStream.close();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值