关于核心java可序列化接口的简单查询

时间:2012-04-29 08:07:41

标签: java serialization interface

任何人都可以告诉我什么是可序列化界面的使用,我google了它并阅读了java内部使用它的许多书籍,但没有解释多于此,但是当我们看到可序列化的界面时,它是一个标记界面,它没有任何内容,如果我们不实现这个接口,那么我们就不会序列化对象。

3 个答案:

答案 0 :(得分:3)

Serializable界面仅是标记界面。这是什么意思?好吧,为了序列化一个对象,你可以使用这样的代码:

final Foo interestingObject = new Foo(42);
final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));

oos.writeObject(interestingObject);
oos.close();

当您将对象传递给ObjectOutputStream时,它会使用反射来执行多项操作。首先,它检查传入的对象是否为Serializable。如果没有,writeObject()会抛出NotSerializableException。然后,在ObjectOutputStream确定对象应该被序列化之后,它会反射性地检查对象的内容,递归地序列化每个字段(static字段和标记为transient的字段除外)

所以你看,界面是一种表明这个对象应该被序列化的方式。如果您没有明确说明该类可以序列化,那么ObjectOutputStream将不会尝试序列化它。但是因为ObjectOutputStream使用反射来检查相关对象的内部,Serializable接口不需要指定任何方法 - ObjectOutputStream不需要调用特定方法

(无论如何这都是简化版本 - 还有一些方法可以定义特定的签名,如果存在,序列化机制会调用它们。如果您有兴趣,请阅读ObjectOutputStream Javadoc 。)

答案 1 :(得分:1)

答案在你的问题中 - “它是一个标记界面”。这仅仅是序列化机制的一个提示,它验证对象图中的所有内容都是Serializable,并在找到不是的东西时抛出异常。原因是,虽然基本上每个对象都可以被序列化,但并不是所有都有意义来序列化(例如Socket存储本机文件描述符 - 如果你将序列化,发送到另一台机器,并在那里反序列化,这将是绝对无用的)。因此,开发人员必须决定应该序列化的内容,开发人员通过实现Serializable来表明该决定。

答案 2 :(得分:0)

我想用实际的例子来解释你,我也像你一样用Google搜索了很多次来完全理解序列化。

首先考虑我想要开发应用程序的场景,在该场景中它不会显示在线用户。我正在使用tomcat集群环境。

我做的是我在用户登录时创建了地图我将在地图中插入他的用户ID并迭代地图以在线显示用户列表。现在的主要问题是第一个用户通过tomcat 1登录,第二个用户通过tomcat 2登录。在这种情况下,tomcat 1中将有两个不同的map对象,jvm将创建tomcat 2,因此我将无法显示no用户在线正确。

解决上述问题 1.我将地图写入可序列化文件并检查地图中是否存在数据我将写入文件,如果有数据,我将从文件中读取数据并放入地图。

serializable的主要用途是在网络上发送数据时将对象状态转换为文件。