Java 对象 序列化/反序列化 Serializable和 Externalizable 基本用法

概念

  1. 所谓序列化是把 Java对象转换成字节流保存到本地文件
  2. 反序列化是指从磁盘读取相关字节流转换成 Java对象的过程

主要功能场景

  1. 持久化到磁盘, 存到数据库等
  2. 为了网络中传输对象
  3. 为了进程之间传递对象

Serializable序列化

类实现 Serializable

  • Java类只要实现了 java.io.Serializable接口就可以序列化相关对象

public class User implements Serializable {
    private static final long serialVersionUID = -5142052165948444605L;
    private Integer age;
    private String name;

    public User() {}

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

对象 序列化/反序列化

  • ObjectInputStream 从字节流中读取对象
  • ObjectOutputStream 对象转换字节流写入

public class App {
    public static void main(String[] args) {
        final User user = new User();
        user.setAge(30);
        user.setName("Shawn Jeon");
        try {
            File file = new File("D:" + File.separator + "User");
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            /** 对象写入到文件*/
            oos.writeObject(user);

            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
            /** 从磁盘读取对象*/
            User user2 = (User) ois.readObject();
            System.out.println(user2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

# 输出 User{age=30, name='Shawn Jeon'}

Externalizable序列化

类实现 Externalizable

  • Java类只要实现了 java.io.Externalizable接口后 @Override相关方法来实现序列化

public class Person implements Externalizable {
    private static final long serialVersionUID = 7274549675763175797L;
    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(age);
        out.writeObject(name);
    }

    @Override
    public void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException {
        this.age = (Integer) oi.readObject();
        this.name = (String) oi.readObject();
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

对象 序列化/反序列化


public class PersonApp {
    public static void main(String[] args) {
        final Person person = new Person();
        person.setAge(30);
        person.setName("Shawn Jeon");
        try {
            File file = new File("D:" + File.separator + "Person");
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            /** 对象写入到文件*/
            oos.writeObject(person);

            ObjectInputStream ois= new ObjectInputStream(new FileInputStream(file));
            /** 从磁盘读取对象*/
            Person person2 = (Person) ois.readObject();
            System.out.println(person2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

# 输出 Person{age=30, name='Shawn Jeon'}

transient关键字

  • 对象序列化时可以指定忽略属性

private transient String name;

序列化ID serialVersionUID

  • serialVersionUID是指定相关序列化对象版本的, 如果序列化后改动此版本 Java JVM会抛出序列化版本不一致的异常

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

发布了62 篇原创文章 · 获赞 325 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qcl108/article/details/102325056