2009-05-18 87 views
8

如果一个类似的问题已经发布在stackoverflow上,请发布链接。为什么它需要将类标记为可序列化?

对需要序列化的对象实现Serializable接口(无方法)需要什么? Java API说 - - 如果未实现,则会抛出java.io.NotSerializableException。

这是因为在ObjectOutputStream.java

............................ 

writeObject0(Object obj, boolean unshared){ 
............. 
} else if (cl.isArray()) { 
     writeArray(obj, desc, unshared); 
     } else if (obj instanceof Serializable) { 
     writeOrdinaryObject(obj, desc, unshared); 
     } else { 
     throw new NotSerializableException(cl.getName()); 
     } 
................ 

下面的代码,但我的问题是,为什么它要实现Serializable,从而通知或告知的Java/JVM一个类可以被序列化。 (只是为了避免这种例外吗?)。

在这种情况下,如果我们编写一个类似的功能,将对象写入流而不检查类是否在一个instanceOf Serializable中,类的对象是否会实现Serializable序列化?

任何帮助表示赞赏。

+3

Dupe of http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface – 2009-05-18 15:03:31

+0

[This question](http://stackoverflow.com/questions/441196/why-java-needs- serializable-interface)对此有一些很好的答案。 – jwoolard 2009-05-18 14:47:58

回答

4

这是一个很好的问题。 Serializable被认为是marker interface,并且可以被看作是类中的标签,以将其标识为具有功能或行为。例如你可以使用它来标识你想要序列化的没有定义serialVersionUid的类(这可能是一个错误)。

请注意,常用的序列化库XStream(和其他)不需要定义Serializable。

2

这是需要的,以便JVM可以知道类是否可以安全地序列化。有些东西(例如数据库连接)包含无法真正序列化的状态或连接到外部资源。

而且,你要确保你把一个serialVersionUID的成员在每一个序列化类,以确保代码更改后的序列化对象可以反序列化或重新编译:

// Set to some arbitrary number. 
// Change if the definition/structure of the class changes. 
private static final long serialVersionUID = 1; 
0

的原因是并不是所有的类都可以被序列化。示例:

  • I/O stuff:InputStream,HTTP connections,channels。它们依赖于在Java VM范围之外创建的对象,并且没有简单的方法来恢复它们。

  • OS的资源,如窗口,图像等

2

序列化可以让你直接保存对象的二进制文件,而无需解析成文本,写出来的字符串,然后创建一个新的对象,并在重新读入时解析字符串输入。主要目的是让您将所有数据的对象保存到二进制文件中。当我不得不使用包含大量相同类型对象的链表时,我发现它非常有用,我需要保存并打开它们。

相关问题