对象的序列化流ObjectOutputStream和对象的反序列化流ObjectInputStream
注意:
static关键字:静态关键字
静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
被static修饰的成员变量不能被序列化,序列化的都是对象
transient关键字:
瞬态关键字 被transient修饰成员变量,也不能被序列化
InvalidClassException异常解决方案:
在实现Serializable的接口中声明:ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; // ANY-ACCESS-MODIFIER(写一个任意访问修饰符),UID可以给任意数值
为什么会出现此异常:
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。 如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。
对象的序列化流ObjectOutputStream:
package com.chunzhi.Test04ObjectStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; /* java.io.ObjectOutputStream extends OutputStream ObjectOutputStream:对象的序列化流 作用:把对象以流的方式写入到文件中保存 构造方法: ObjectOutputStream(OutputStream out):创建写入指定OutputStream的ObjectOutputStream 参数: OutputStream out:字节输出流 特有的成员方法: void writeObject(Object obj):将指定的对象写入ObjectOutputStream 使用步骤: 1.创建ObjectOutputStream对象,构造方法中传递字节输出流 2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中 3.释放资源 */ public class Test01ObjectOutputStream { public static void main(String[] args) throws IOException { // 1.创建ObjectOutputStream对象,构造方法中传递字节输出流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Day10_IO\\Person.txt")); // 2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中 oos.writeObject(new Person("迪丽热巴", 22)); // 3.释放资源 oos.close(); } }
package com.chunzhi.Test04ObjectStream; import java.io.Serializable; /* 序列化和反序列化的时候,会抛出NotSerializableException(没有序列化异常) 类通过实现java.io.Serializable接口以启用其序列化功能。未实现此接口的类将无法使用其任何状态序列化或与反序列化。 Serializable接口也叫标记型接口 要进行序列化和反序列化的类必须实现Serializable接口,它会给类添加一个标记 当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记 有:可以进行序列化和反序列化 没有:就会抛出NotSerializableException异常 */ public class Person implements Serializable { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } 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; } }
对象的反序列化流ObjectInputStream:
package com.chunzhi.Test04ObjectStream; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; /* java.io.ObjectInputStream extends InputStream ObjectInputStream:对象的反序列化 作用:把文件中保存的对象,以流的方式读取出来使用 构造方法: ObjectInputStream(InputStream in):创建从指定InputStream读取的ObjectInputStream 参数: InputStream in:字节输入流 特有的成员方法: ObjectInputStream():从ObjectInputStream读取对象 使用步骤: 1.创建ObjectInputStream对象,构造方法中传递字节输入流 2.使用ObjectInputStream对象中的方法readObject读取保存对象的文件 3.释放资源 4.使用读取出来的对象(打印) readObject方法声明抛出了ClassNotFoundException(class文件找不到异常) 意思就是:当不存在对象的class文件时抛出此异常 反序列化的前提: 1.类必须实现Serializable 2.必须存在类对应的class文件 */ public class Test02ObjectInputStream { public static void main(String[] args) throws IOException, ClassNotFoundException { // 1.创建ObjectInputStream对象,构造方法中传递字节输入流 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Day10_IO\\Person.txt")); // 2.使用ObjectInputStream对象中的方法readObject读取保存对象的文件 Object person = ois.readObject(); // 3.释放资源 ois.close(); // 4.使用读取出来的对象(打印) System.out.println(person); // Person{name='迪丽热巴', age=22} Person p = (Person)person; // 强转 System.out.println(p.getName() + p.getAge()); // 迪丽热巴22 } }