Rumah  >  Soal Jawab  >  teks badan

序列化 - 如何理解java.io.Serializable接口

java.io.Serializable是一个没有任何待实现方法的接口,此接口在对象序列化的过程中起到了什么作用?或者此接口在java序列化机制中扮演什么角色?

伊谢尔伦伊谢尔伦2764 hari yang lalu473

membalas semua(2)saya akan balas

  • 巴扎黑

    巴扎黑2017-04-17 12:05:04

    Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
    摘抄于http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html
    PS:链接文章有详细的使用示例哟

    大白话就是这个接口允许你把内存里你实例化的对象,当做文件保存下来。有什么用呢,举几个栗子
    1.游戏存档:把主人公这个实力对象保存成文件,下次打开游戏就可以加载,接着玩啦哇
    2.网络通信:一个机器上实例的对象,要传给另一台机器,先保存成文件再传哇


    题主改题之后

    你是想了解序列化的机理对吧,既然你诚心诚意的发问了,武藏小次郎~~~~~

    好吧来看一下使用ObjectOutputStream类持久化一个对象的过程,writeObject0(Object obj, boolean unshared) 函数的源码1170~1185行(JDK 1.7.0_45)

     if (obj instanceof String) {
        writeString((String) obj, unshared);
    } else if (cl.isArray()) {
        writeArray(obj, desc, unshared);
    } else if (obj instanceof Enum) {
        writeEnum((Enum) obj, desc, unshared);
    } else if (obj instanceof Serializable) {
        writeOrdinaryObject(obj, desc, unshared);
    } else {
        if (extendedDebugInfo) {
            throw new NotSerializableException(
                cl.getName() + "\n" + debugInfoStack.toString());
        } else {
            throw new NotSerializableException(cl.getName());
        }
    }
    

    看到了吧,对象如果是String、是数组、是枚举、是Serializable就相应的函数把对象写成文件否则抛出错误,扮演什么角色呢,就是一个标志而已。

    如果仅仅只是让某个类实现Serializable接口,而没有其它任何处理的话,则就是使用默认序列化机制。使用默认机制,在序列化对象时,不仅会序列化当前对象本身,还会对该对象引用的其它对象也进行序列化,同样地,这些其它对象引用的另外对象也将被序列化,以此类推。所以,如果一个对象包含的成员变量是容器类对象,而这些容器所含有的元素也是容器类对象,那么这个序列化的过程就会较复杂,开销也较大。
    依然摘抄与上个链接

    Externalizable继承于Serializable,当使用该接口时,序列化的细节需要由程序员去完成。我想你是需要这个~~~

    balas
    0
  • 黄舟

    黄舟2017-04-17 12:05:04

    空接口在使用 instanceof 来判断类型的时候就有用了

    public class Test {
        public static void main(String[] args) {
            T1 t1 = new T1();
            T2 t2 = new T2();
    
            System.out.println("t1: " + (t1 instanceof java.io.Serializable));
            System.out.println("t1: " + (t2 instanceof java.io.Serializable));
        }
    }
    
    class T1 {}
    
    class T2 implements java.io.Serializable {}
    
    

    如果你看 OpenJDK 的源码,可以看到 ObjectOutputStream.java 中有这么一段与之有关的代码:

                // remaining cases
                if (obj instanceof String) {
                    writeString((String) obj, unshared);
                } else if (cl.isArray()) {
                    writeArray(obj, desc, unshared);
                } else if (obj instanceof Enum) {
                    writeEnum((Enum) obj, desc, unshared);
                } else if (obj instanceof Serializable) {
                    writeOrdinaryObject(obj, desc, unshared);
                } else {
                    if (extendedDebugInfo) {
                        throw new NotSerializableException(
                            cl.getName() + "\n" + debugInfoStack.toString());
                    } else {
                        throw new NotSerializableException(cl.getName());
                    }
                }
    

    源码参考 http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/d1f592073a0e/src/share/classes/java/io/ObjectOutputStream.java 第 1176

    balas
    0
  • Batalbalas