系统流
-
err、out、in 都是字节流
-
系统流是静态的,不需要关流
序列化与反序列化
- 序列化是将对象按字节顺序进行存储,并且在以后需要时重新还原它们(称为反序列化)的一种机制。
- 可以通过序列化机制,将一个对象保存在文件中,或通过 络传送到另一台计算机上。
- 当对象被序列化时,JVM只序列化其字段值,方法和构造器不参与序列化。
- 如果对象的某个字段引用了另一个对象,则被引用对象的字段也将被序列化。
- 被应用对象的类也需要实现Serializable接口
- Java中的包裹类和String都实现了Serializable接口
- Java中常用的集合实现类和Map集合实现类都实现了Serializable接口
- 如果某个属性不想参与序列化,可以使用进行修饰
- 有些对象类(如FileInputStream)是不可序列化的,因为其字段值是与操作系统相关的即时信息。
- 访问控制修饰符(public、protected、default和private)对序列化的数据字段没有任何影响。
- 静态变量不参与序列化,因为它们不属于对象。
- 对于应用程序自定义的类,必须实现java.io.Serializable接口,其对象才能参与序列化。
- java.io.Serializable接口中没有方法,它仅作为一个标记,用于表示实现该接口的类可以用于序列化。
- 如果类中某些字段包含了对不可序列化对象的引用,或有的字段不需要参与序列化,只要将其修饰为transient即可。
-
当一个类实现了java.io.Serializable接口后,可以显式的在类中声明一个属性,作为该类的标识,用于验证序列化和反序列化使用的类是否一致:
-
在序列化该类的对象时,这一串数字会被优先写入数据中
-
当反序列化时,会先验证当前环境下使用的类的serialVersionUID与数据中保存的serialVersionUID是否一致,如果一致,则继续进行反序列化,如果不一致,则直接抛出异常
对象序列化规则
自定义序列化
serialVersionUID
public class TestSerialization { public static void main(String[] args) {FileOutputStream fos = null;BufferedOutputStream bos = null;ObjectOutputStream oos = null;try { fos = new FileOutputStream("./testSer.dat"); bos = new BufferedOutputStream(fos); oos = new ObjectOutputStream(bos); Student s1 = new Student(1, "zhang", 20); oos.writeObject(s1); Student s2 = new Student(2, "li", 30); oos.writeObject(s2);} catch (IOException e) { e.printStackTrace();} finally { if (oos != null) { try {oos.close(); } catch 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!