84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
java.io.Serializable是一个没有任何待实现方法的接口,此接口在对象序列化的过程中起到了什么作用?或者此接口在java序列化机制中扮演什么角色?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
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,当使用该接口时,序列化的细节需要由程序员去完成。我想你是需要这个~~~
空接口在使用 instanceof 来判断类型的时候就有用了
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 行
1176
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)
看到了吧,对象如果是String、是数组、是枚举、是Serializable就相应的函数把对象写成文件否则抛出错误,扮演什么角色呢,就是一个标志而已。
如果仅仅只是让某个类实现Serializable接口,而没有其它任何处理的话,则就是使用默认序列化机制。使用默认机制,在序列化对象时,不仅会序列化当前对象本身,还会对该对象引用的其它对象也进行序列化,同样地,这些其它对象引用的另外对象也将被序列化,以此类推。所以,如果一个对象包含的成员变量是容器类对象,而这些容器所含有的元素也是容器类对象,那么这个序列化的过程就会较复杂,开销也较大。
依然摘抄与上个链接
Externalizable继承于Serializable,当使用该接口时,序列化的细节需要由程序员去完成。我想你是需要这个~~~
空接口在使用
instanceof
来判断类型的时候就有用了如果你看 OpenJDK 的源码,可以看到 ObjectOutputStream.java 中有这么一段与之有关的代码:
源码参考 http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/d1f592073a0e/src/share/classes/java/io/ObjectOutputStream.java 第
1176
行