美文网首页
[java]15、序列化

[java]15、序列化

作者: 史记_d5da | 来源:发表于2021-10-19 21:45 被阅读0次

    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);
        }
    }
    

    相关文章

      网友评论

          本文标题:[java]15、序列化

          本文链接:https://www.haomeiwen.com/subject/ljkboltx.html