可能是重复问题:
什么是对象序列化?
我使用Swing创建了一个小型的RSS阅读器应用程序,Eclipse一直告诉我:"可序列化类MochaRSSView未声明静态final serialVersionUID字段,类型为long"
什么是序列化,它有什么好处?
Serializable是一个标记接口,告诉JVM它可以将对象的状态写入某个流中(基本上读取所有成员,并将其状态写入流或磁盘等)。默认机制是二进制格式。您还可以使用它来克隆东西,或在调用之间保持状态,发送对象到网络等。
您可以让Eclipse为您生成它(基本上只是一个长的随机但唯一的ID)。这意味着您可以控制何时认为类与序列化版本兼容或不兼容。
(注意:所有非瞬态成员变量必须是可序列化类,否则您将收到错误 - 因为JVM将递归遍历结构,写出每个对象的状态,直到编写原始数据到ObjectOutputStream的层次为止)。
Java序列化——你是否见过序列化对象的内部结构?本文将为您讲解什么是Java序列化,提供一个序列化示例。更重要的是,我们将探讨序列化对象的内部结构及其含义,即Java序列化的内部机制以及其工作原理。如果您想拥有自己的Java序列化实现,本文将为您提供一个良好的平台。
什么是Java序列化? Java序列化的主要目的是将对象写入流中,以便通过网络传输,并且该对象可以再次重建。当涉及到两个不同的参与方时,您需要一种协议来重新构建完全相同的对象。Java序列化API正是提供了这一点。您还可以利用序列化的特性来执行深度复制。
我在上面的定义中使用“主要目的”的原因是,有时人们使用Java序列化替换数据库,在其中存储一个对象跨会话持久化,只是一个占位符。Java序列化的主要目的不是这样。有时,当我面试Java候选人时,他们会说Java序列化用于存储(以保留状态)对象并检索它。他们将其与数据库视为同义词。这是序列化的错误认知。
如何序列化? 当您想要序列化一个对象时,该类应实现标记接口Serializable。它只是通知编译器这个Java类可以被序列化。您可以将不应序列化的属性标记为transient。您打开一个流并将对象写入其中。Java API会处理序列化协议,并根据协议将Java对象持久化到文件中。反序列化是从文件获取对象并将其恢复到其原始形式的过程。
这里的协议是指序列化者和反序列化者之间的理解。包含序列化对象的文件的内容是什么?
序列化是将对象写入可读的形式,允许在不同的时间重新创建对象。如果我在计算机A上使用一个JVM创建了一个小部件,对其进行序列化并保存,并将其发送到运行不同JVM的计算机B,则其他JVM可以将其反序列化并使用相同的值和结构重新创建它。
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();
}
这可能不是世界上最好的系统(尽管它比许多人认为的要好得多)。
序列化是一种将对象(类的实例)设置为可传输的方式,可以通过网络、磁盘等进行传输。
序列化是将对象实例的表示写入流(或一系列字节)的过程。请参阅Sun对此的解释:http://java.sun.com/developer/technicalArticles/Programming/serialization/