Java 通过stream实现对象序列化和反序列化

173 阅读1分钟

在日常开发中,序列化和反序列化是我们经常碰到的问题,在Java中可以通过 ObjectInputStream 实现对象的反序列化,通过 ObjectOutputStream 实现对象的序列化。

下面是序列化的简单实例:

package learnjava.serializable;

import java.io.*;

public class NativeSerializable {
    public static void main(String[] args) {
        String output = new String("D:\software\intelli D\myDemo\src\learnjava\serializable\stu");
        Serializable stu = new Student(1111, "Alice", 25);

        serializable(output, stu);

        Serializable loadStu = deserializable(output);
        System.out.println(loadStu.toString());
    }

    // serializable
    public static void serializable(String output, Serializable stu) {
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(output))) {
            out.writeObject(stu);
            System.out.println("Student obj has been serializable to file.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // deserializable
    public static Serializable deserializable(String input) {
        Serializable stu = null;
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(input))) {
            stu = (Student) in.readObject(); // type transform
            System.out.println("Student obj has been deserializable to obj.");
        } catch (IOException | ClassNotFoundException e) { // catch multi Exceptions
            e.printStackTrace();
        }

        return stu;
    }
}

/**
 * caution: 如果字段是 static(belong to class, not instance) 或者是
 * transient(only exist in runtime) 时,默认不序列化该成员的
 */
class Student implements Serializable {
    private int id;
    private String name;
    private int age;
    // 以下通过IDE生成相关代码
    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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 "Student{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}