Java中的序列化是什么?

21

可能是重复问题:
什么是对象序列化?

我使用Swing创建了一个小型的RSS阅读器应用程序,Eclipse一直告诉我:"可序列化类MochaRSSView未声明静态final serialVersionUID字段,类型为long"

什么是序列化,它有什么好处?


有关详细说明,请参考可能的重复内容。 - Ankit Sharma
这是一个短视频解释:https://youtu.be/BQFYQPfERIE - VedantK
7个回答

41

Serializable是一个标记接口,告诉JVM它可以将对象的状态写入某个流中(基本上读取所有成员,并将其状态写入流或磁盘等)。默认机制是二进制格式。您还可以使用它来克隆东西,或在调用之间保持状态,发送对象到网络等。

您可以让Eclipse为您生成它(基本上只是一个长的随机但唯一的ID)。这意味着您可以控制何时认为类与序列化版本兼容或不兼容。

(注意:所有非瞬态成员变量必须是可序列化类,否则您将收到错误 - 因为JVM将递归遍历结构,写出每个对象的状态,直到编写原始数据到ObjectOutputStream的层次为止)。


28

Java序列化——你是否见过序列化对象的内部结构?本文将为您讲解什么是Java序列化,提供一个序列化示例。更重要的是,我们将探讨序列化对象的内部结构及其含义,即Java序列化的内部机制以及其工作原理。如果您想拥有自己的Java序列化实现,本文将为您提供一个良好的平台。

什么是Java序列化? Java序列化的主要目的是将对象写入流中,以便通过网络传输,并且该对象可以再次重建。当涉及到两个不同的参与方时,您需要一种协议来重新构建完全相同的对象。Java序列化API正是提供了这一点。您还可以利用序列化的特性来执行深度复制。

我在上面的定义中使用“主要目的”的原因是,有时人们使用Java序列化替换数据库,在其中存储一个对象跨会话持久化,只是一个占位符。Java序列化的主要目的不是这样。有时,当我面试Java候选人时,他们会说Java序列化用于存储(以保留状态)对象并检索它。他们将其与数据库视为同义词。这是序列化的错误认知。

如何序列化? 当您想要序列化一个对象时,该类应实现标记接口Serializable。它只是通知编译器这个Java类可以被序列化。您可以将不应序列化的属性标记为transient。您打开一个流并将对象写入其中。Java API会处理序列化协议,并根据协议将Java对象持久化到文件中。反序列化是从文件获取对象并将其恢复到其原始形式的过程。

这里的协议是指序列化者和反序列化者之间的理解。包含序列化对象的文件的内容是什么?


26
这是从这个链接复制的吗?至少尝试改变一些词语。 http://javapapers.com/core-java/java-serialization/ - Konza

7

序列化是将对象写入可读的形式,允许在不同的时间重新创建对象。如果我在计算机A上使用一个JVM创建了一个小部件,对其进行序列化并保存,并将其发送到运行不同JVM的计算机B,则其他JVM可以将其反序列化并使用相同的值和结构重新创建它。


6

Java序列化是一种持久化对象结构的方法。

对于可序列化的类来说,最佳实践是声明serialVersionUID作为一个private static final long编译时常量。这用于检查对象数据和类代码是否兼容。

那么为什么Eclipse会告诉你这个呢?可能是因为你正在扩展的类(或潜在的接口你正在实现)实现了java.io.Serializable。这意味着所有子类型,包括你的都是可序列化的。几乎可以确定你并不关心这个。你可以通过在类或包(在package-info.java中)上应用@SuppressWarnings("serial")来清除警告。如果你想强制阻止序列化你的类的实例,则添加(从记忆中):

private static final java.io.ObjectStreamField[] serialPersistentFields = {
    null
};
private void writeObject(
    java.io.ObjectOutputStream ou
) throws java.io.IOException {
    throw new java.io.NotSerializableException();
}
private void readObject(
    java.io.ObjectInputStream in
) throws java.io.IOException, java.lang.ClassNotFoundException {
    throw new java.io.NotSerializableException();
}
private void readObjectNoData(
) throws java.io.ObjectStreamException {
    throw new java.io.NotSerializableException();
}

这可能不是世界上最好的系统(尽管它比许多人认为的要好得多)。


5

序列化是将对象转换为可存储在磁盘上的格式,以便在以后重新加载它。请查看链接了解更多信息!


3

序列化是一种将对象(类的实例)设置为可传输的方式,可以通过网络、磁盘等进行传输。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接