美文网首页
[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-序列化-反序列化

    Thanks Java基础学习总结——Java对象的序列化和反序列化java序列化反序列化原理Java 序列化的高...

  • java序列化那些事儿

    java序列化作用 在说java序列化的作用之前,先说下什么是java序列化吧。java序列化是指把java对象转...

  • Java序列化

    Java序列化的几种方式以及序列化的作用 Java基础学习总结——Java对象的序列化和反序列化

  • Java序列化机制

    Java序列化机制 序列化和反序列化 Java序列化是Java内建的数据(对象)持久化机制,通过序列化可以将运行时...

  • Java 序列化 之 单例模式

    序列化相关文章: Java 序列化 之 Serializable Java 序列化之 Externalizable...

  • java 序列化 原理解析

    序列化相关文章: Java 序列化 之 Serializable Java 序列化之 Externalizable...

  • 认识Java序列化

    我的个人博客,认识Java序列化 引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java ...

  • JDK 序列化

    序列化和分序列化概念 什么是序列化和反序列化 Java序列化是指把Java对象转换为字节序列的过程,而Java反序...

  • Spark序列化

    Java序列化 有关Java对象的序列化和反序列化也算是Java基础的一部分,首先对Java序列化的机制和原理进行...

  • Serializable中为什么要设置UID

    1、什么是Java序列化与反序列化 Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指...

网友评论

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

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