[java]15、序列化

2021-10-19  本文已影响0人  史记_d5da

1、概述

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据 、 对象的 类型 和 对象中存储的属性 等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。 对象的数据 、 对象的类型 和 对象中 存储的数据 信息,都可以用来在内存中创建对象


序列化

2、ObjectOutputStream

java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。

// Person.java
// 类通过实现 java.io.Serializable 接口以启用序列化功能, 不实现此接口的类将不会使任 何状态序列化或反序列化,会抛出 NotSerializableException 
// Serializable称为标记性接口
public class Person implements Serializable {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
// Dem01ObjectOutputStream.java
public class Dem01ObjectOutputStream {
    public static void main(String[] args) throws IOException {
        String p = "person.txt";
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(p));
        oos.writeObject(new Person("小美女", 18));
        oos.close();
    }
}

3、ObjectInputStream

ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

public class Demo02ObjectInputStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String p = "person.txt";
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(p));
        Object obj = ois.readObject(); // 声明抛出异常ClassNotFoundException(class文件找不到异常)
        ois.close();
        System.out.println(obj);
        Person per = (Person)  obj;
        System.out.println(per);
    }
}

4、transient

1、static关键字:静态关键字
静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
被static修饰的成员变量不能被序列化,序列化都是对象
2、transient关键字:瞬态关键字
被transient修饰的成员变量,不能被序列化

5、序列号冲突异常

异常信息


异常信息

解决方案


解决方案
// Person.java
public class Person implements Serializable {
    // 通过添加序列号的方式解决
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }
}

5、序列化存储ArrayList

public class Demo03Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ArrayList<Person>list = new ArrayList<>();
        list.add(new Person("小米", 14));
        list.add(new Person("大明", 15));
        list.add(new Person("米粒", 16));
        String p = "/Users/shiji/study/java/itcast/day02-code/src/com/sj/demo04ObjectStream/list.txt";
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(p));
        oos.writeObject(list);
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(p));
        Object obj = ois.readObject();
        ArrayList ol = (ArrayList) obj;
        System.out.println(ol);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读