java.io.Serializable是一个没有任何待实现方法的接口,此接口在对象序列化的过程中起到了什么作用?或者此接口在java序列化机制中扮演什么角色?
巴扎黑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,当使用该接口时,序列化的细节需要由程序员去完成。我想你是需要这个~~~
黄舟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
行