对对象的序列化

对对象的序列化

  • 序列化

        sum s = new sum();
            s.soul =526;
            s.sun=256;
            try {
          
          
                FileOutputStream ou = new FileOutputStream("yGame.ser");
                ObjectOutputStream os = new ObjectOutputStream(ou);
                os.writeObject(s);
                os.close();
            } catch (Exception e) {
          
          
                e.printStackTrace();
            }
    
  • 从文件中读出对象的值

    try {
          
          
        FileInputStream om = new FileInputStream("yGame.ser");
        ObjectInputStream input = new ObjectInputStream(om);
        Object[] ser = new Object[12];
        int i=0;
    
            ser[i++] = input.readObject();
            sum mm= new sum();
            mm = (sum) ser[0];
            input.close();
        System.out.println(mm.sun);
        System.out.println(mm.soul);
    
    } catch (FileNotFoundException e) {
          
          
        e.printStackTrace();
    } catch (IOException e) {
          
          
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
          
          
        e.printStackTrace();
    }
    
  • 读出过程 :

    1 . 对象从 Stream中读出来

    2.Java JVM通过储存的信息判断对象的class类型

    3.Java JVM 尝试寻找和加载对象的类,如果Java JVM找不到或无法加载时该类,则Java JVM

    会抛出例外。

    4.新的对象会被配置在堆上,但是构造函数不会执行!这样对象就成了新的状态,我们需要的是储存时候的状态 。

    5.if 对象在继承树上有个不可序列化的祖先类,则该不可序列化樊以及在它之上的类的构造函数(就

    算是可序列化也一样 会执行一旦构造函数披连锁启动之后将无法停止 也就是说。从第 个不可

    序列化的父类开始.全部都会重新初始状态。

    6.对象的实例变量会被还原成实例化时顶的状态值。transient变量会被复制null的对量。引用或primitive主,那数据类型的默认值为0,false等值。

  • 静态变量不会被序列化

    要点

    • 你可以通过序列化来存储对象的状态。
    • 使用ObjctOuputStean来序列化对象(java.io)。
    • Surcam是连接申流或是链接用的串流。
    • 连接串流用来表示源或目的地、文件、则络套接字连接。
    • 链接用串流用来衔接连接串流。
    • 用FilcOutpuSream链接ObjectouputStream来将对象序列化
      到文件上。
    • 调用ObjectoupuStrcam的writeobject(heobject)来将对象序列化,不需调用FileOutputStream的方法。
    • 对象必须实现序列化这个接口才能被序列化。如果父类实现序列化,则子类也就自动地有实现,而不管是否有明确的声明。
    • 当对象被序列化时,整个对象版图都会被序列化。这代表它的实例变量所引用的对象也会被序列化。
    • 如果有不能序列化的对象,执行期间就会抛出异常。
    • 除非该实例变量被标记为transient。否则,该变量在还原的时候会被赋子予null或primitive主数据类型的默认值。
    • 在解序列化时(deserialization),所有的类都必须能让Java虚拟机找到。
    • 读取对象的顺序必须与写人的顺序相同。
    • readObject()的返回类型是Object,因此解序列化回来的对象还需要转换成原来的类型。
    • 静态变量不会被序列化,因为所有对象都是共享同一份静态变量值。

  • 1)序列化适用于存储散据输非J加a程序使用的情境。False
    (3)OyeciOutputscam是个用来存健序列化对象的类。True
    (4)磁接申流可以单独使用成与做接申流并用。False
    (5)调用witcObjec()可能会存储好几个对象。True
    (7)transicnt这个修饰符让你将实例变量标记为可序列化的。False
    (8)如果父类是不可序列化的,则子类就不能设定成可序列化。False
    (9)当对象被序列化时,它的读取顺序必须是相反的。False
    (10)当对象还原时,构造函数不会执行。True
    (11)序列化与使用文本文件保存的操作都可能会抛出异常。True
    (12)BufferedWriter可以链接到FileWriter上。True
    (13)File对象代表文件而不是目录。False
    (15)文件的读写申流机制可以用到缓冲区机制。True
    (16)String的splitO金将分隔字符解析成结果的一部分。False
    (17)对类的任何修改都会破坏之前的序列化对象。False

猜你喜欢

转载自blog.csdn.net/weixin_45729594/article/details/109005219