谁能告诉我什么是可序列化接口的用途,我用谷歌搜索并阅读了很多java内部使用它的书籍,但没有解释更多,但是当我们看到可序列化接口时,它是一个标记接口,什么都没有在它的主体中,如果我们不实现这个接口,那么我们就不会序列化对象。
3 回答
该Serializable
接口只是一个标记接口。这是什么意思?好吧,要序列化一个对象,您可以使用如下代码:
final Foo interestingObject = new Foo(42);
final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(interestingObject);
oos.close();
当您将对象传递给 时ObjectOutputStream
,它使用反射来做几件事。首先,它检查传入的对象是否为 implements Serializable
。如果没有,则writeObject()
抛出NotSerializableException
. 然后,在ObjectOutputStream
确定对象应该被序列化后,它会反射性地检查对象的内容,递归地序列化每个字段(static
字段和标记为的字段除外transient
)。
所以你看,接口是指示这个对象应该被序列化的一种方式。如果您没有明确说可以序列化该类,则ObjectOutputStream
不会尝试对其进行序列化。但是因为 anObjectOutputStream
使用反射来检查相关对象的内部结构,所以Serializable
接口不需要指定任何方法——ObjectOutputStream
不需要调用特定的方法。
(无论如何,那是简化的版本——还有一堆方法可以定义特定的签名,如果它们存在,序列化机制会调用它们。如果你有兴趣,请阅读ObjectOutputStream
Javadoc。)
答案就在您的问题中-“它是一个标记界面”。这只是序列化机制的一个提示,它验证对象图中的所有内容是否存在,Serializable
并在找到不存在的内容时抛出异常。原因是,虽然基本上每个对象都可以序列化,但并不是所有的东西都可以序列化(例如,Socket
存储本机文件描述符——如果你要序列化它,发送到另一台机器,然后在那里反序列化,那绝对没用)。因此,应该由开发人员决定应该序列化什么,开发人员通过实现来体现该决定Serializable
。
我想用实际的例子来解释你,我也和你一样,我用谷歌搜索了很多次以完美地理解序列化。
首先考虑一个我想开发应用程序的场景,在该场景中它不会显示在线用户。我正在使用tomcat集群环境。
我所做的是我在用户登录时创建了地图,我将在地图中插入他的用户 ID 并遍历地图以显示在线用户列表。现在主要问题是第一个用户通过tomcat 1登录,第二个用户通过tomcat 2登录。在这种情况下,由jvm创建的tomcat 1和tomcat 2中有两个不同的map对象,所以我将无法显示没有用户正常上网。
解决上述问题 1.我将映射写入可序列化文件并检查映射中是否不存在数据我将写入文件,如果有数据则我将从文件中读取数据并放入映射中。
可序列化的主要用途是在网络上发送数据时将对象状态转换为文件。