Java基础 Day 18

系统流

  • err、out、in 都是字节流

  • 系统流是静态的,不需要关流

序列化与反序列化

  • 序列化是将对象按字节顺序进行存储,并且在以后需要时重新还原它们(称为反序列化)的一种机制。
  • 可以通过序列化机制,将一个对象保存在文件中,或通过 络传送到另一台计算机上。
  • 对象序列化规则

    • 当对象被序列化时,JVM只序列化其字段值,方法和构造器不参与序列化。
    • 如果对象的某个字段引用了另一个对象,则被引用对象的字段也将被序列化。
      • 被应用对象的类也需要实现Serializable接口
      • Java中的包裹类和String都实现了Serializable接口
      • Java中常用的集合实现类和Map集合实现类都实现了Serializable接口
    • 如果某个属性不想参与序列化,可以使用进行修饰
    • 有些对象类(如FileInputStream)是不可序列化的,因为其字段值是与操作系统相关的即时信息。
    • 访问控制修饰符(public、protected、default和private)对序列化的数据字段没有任何影响。
    • 静态变量不参与序列化,因为它们不属于对象。

    自定义序列化

    • 对于应用程序自定义的类,必须实现java.io.Serializable接口,其对象才能参与序列化。
    • java.io.Serializable接口中没有方法,它仅作为一个标记,用于表示实现该接口的类可以用于序列化。
    • 如果类中某些字段包含了对不可序列化对象的引用,或有的字段不需要参与序列化,只要将其修饰为transient即可。

    serialVersionUID

    • 当一个类实现了java.io.Serializable接口后,可以显式的在类中声明一个属性,作为该类的标识,用于验证序列化和反序列化使用的类是否一致:

    • 在序列化该类的对象时,这一串数字会被优先写入数据中

    • 当反序列化时,会先验证当前环境下使用的类的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进行处理,非常感谢!

上一篇 2022年1月15日
下一篇 2022年1月15日

相关推荐