重温java知识(三十八、I/O编程之十二:对象序列化)

序列化是一种对象的传输手段。

对象序列化,就是把一个对象变为二进制的数据流的一种方法。通过对象序列化可以方便的实现对象的传输或存储。

一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口。然而此接口并没有提供任何的抽象方法,所以该接口就是一个标识接口,只是表示一种对象可以被序列化的能力。

对于对象序列化和反序列化的具体实现,则需要依靠ObjectOutputStream与ObjectInputStream两类完成。

  • ObjectOutputStream:可以将对象转为特定格式的二进制数据输出;
  • ObjectInputStream:可以读取ObjectOutputStream类输出的二进制对象数据,并将其转为具体类型的对象返回。

1、定义序列化对象类:

package com.mydemo;

import java.io.*;

public class FileIODemo {

    // 本次操作将要序列化的对象保存到文件中,将文件定义为公共常量
    private static final File SAVE_FILE = new File("e:" + File.separator + "test.txt");

    public static void main(String[] args) throws Exception {

        // 对象序列化
        saveObject(new Member("张三", 18));

        // 对象反序列化
        System.out.println(loadObject());

    }

    /**
     * 序列化操作---输出流
     *
     * @param o
     * @throws Exception
     */
    public static void saveObject(Object o) throws Exception {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));

        // 序列化
        objectOutputStream.writeObject(o);

        objectOutputStream.close();
    }

    /**
     * 反序列化---读取流
     *
     * @return
     * @throws Exception
     */
    public static Object loadObject() throws Exception {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(SAVE_FILE));

        // 反序列化
        Object obj = objectInputStream.readObject();

        objectInputStream.close();
        return obj;
    }
}

// 定义序列化对象类
@SuppressWarnings("serial") // 序列化需要序列化编号,该编号编译时可以自动生成
class Member implements Serializable {

    private String name;
//    private int age;
    /**
     * 有些属性可能并不需要进行序列化的处理,
     * 这个时候就可以在属性定义上使用“transient”关键字来完成了。
     * <p>
     * 该程序进行Member类对象序列化处理时,age属性的内容是不会被保存下来的,
     * 这样在进行对象反序列化操作时,age使用的将是其对应数据类型的默认值。
     */
    private transient int age;

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

    @Override
    public String toString() {
        return "Member{" +
                "姓名:'" + this.name + '\'' +
                ", 年龄:" + this.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;
    }
}

运行结果:
Member{姓名:'张三', 年龄:0}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值