【发布时间】:2010-10-11 03:41:48
【问题描述】:
我使用 Swing 制作了一个小型 RSS 阅读器应用程序,Eclipse 一直告诉我“可序列化类 MochaRSSView 没有声明 long 类型的静态最终 serialVersionUID 字段”
什么是序列化,它有什么好处?
【问题讨论】:
-
详细描述请参考可能重复。
标签: java
我使用 Swing 制作了一个小型 RSS 阅读器应用程序,Eclipse 一直告诉我“可序列化类 MochaRSSView 没有声明 long 类型的静态最终 serialVersionUID 字段”
什么是序列化,它有什么好处?
【问题讨论】:
标签: java
Serializable 是一个标记接口,它告诉 JVM 它可以将对象的状态写出到某个流(基本上是读取所有成员,并将它们的状态写到流、磁盘或其他东西)。默认机制是二进制格式。您还可以使用它来克隆事物,或在调用之间保持状态,通过网络发送对象等。
您可以让 eclipse 为您生成一个(基本上只是一个长的随机但唯一的 ID)。这意味着您可以控制何时认为某个类与序列化版本兼容。
(注意:所有非瞬态成员变量都必须是可序列化的类,否则会出错 - 因为 JVM 将通过结构递归写出每个对象的状态,直至将原语写入到ObjectOutputStream)。
【讨论】:
Java 序列化-----你见过序列化对象里面有什么吗?我将向您解释什么是 java 序列化,然后为您提供序列化的示例。最后最重要的是,让我们探索序列化对象内部的内容及其含义。那是java序列化的内部结构以及它是如何工作的。如果你想拥有自己的java序列化实现,本文将为你提供一个很好的启动平台。
什么是 Java 序列化? java 序列化的主要目的是将对象写入流中,以便它可以通过网络传输,并且可以再次重建该对象。当涉及到两个不同的参与方时,您需要一个协议来再次重建完全相同的对象。 Java 序列化 API 只是为您提供了这一点。您可以利用序列化功能的其他方法是,您可以使用它来执行深层复制。
我在上面的定义中使用“主要目的”的原因是,有时人们使用 java 序列化作为数据库的替代品。只是一个占位符,您可以在其中跨会话保留对象。这不是 java 序列化的主要目的。有时,当我采访 Java 的候选人时,我听到他们说 Java 序列化用于存储(保存状态)对象并检索它。他们将其与数据库同义使用。这是对序列化的错误认识。
你如何序列化? 当您想要序列化一个对象时,相应的类应该实现可序列化的标记接口。它只是通知编译器这个 java 类可以被序列化。您可以标记不应序列化为瞬态的属性。您打开一个流并将对象写入其中。 Java API 负责序列化协议,并将 java 对象保存在符合协议的文件中。反序列化是将对象从文件中恢复为原始形式的过程。
这里的协议意味着,序列化人和反序列化人之间的理解。包含序列化对象的文件的内容是什么?
【讨论】:
序列化是将对象写入可读的形式,并允许在不同的时间重新创建对象。 因此,如果我在计算机 A 上的一个 JVM 下创建了一个小部件,对其进行序列化并保存并将其发送到运行不同的计算机 B,则另一个 JVM 将能够对其进行反序列化并使用相同的值和结构重新创建它
【讨论】:
Java 序列化是一种持久化对象结构的方法。
可序列化类的最佳实践是将serialVersionUID 声明为private static final long 编译时常量。这用于检查对象数据和类代码是否声称兼容。
那么为什么 Eclipse 会告诉你这个?您正在扩展的类(或您正在实现的潜在接口)可能实现了java.io.Serializable。这意味着所有子类型,包括您的子类型都是可序列化的。几乎可以肯定你不在乎。您应该能够通过在类或包上应用@SuppressWarnings("serial")(在package-info.java 中)来清除警告。如果你想强制阻止你的类的实例被序列化,那么添加(从内存中):
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();
}
它可能不是世界上经过深思熟虑的系统(尽管它比许多人认为的要好得多)。
【讨论】:
Serialization 是将对象转换为磁盘存储格式的过程,以便稍后重新加载。查看链接了解更多信息!
【讨论】:
序列化是一种获取对象(您的类的实例)并将其设置为传输的方法——通过网络、到磁盘等。
【讨论】:
序列化是将对象实例的表示写入流(或字节序列)的过程。 看看 Sun 怎么说:http://java.sun.com/developer/technicalArticles/Programming/serialization/
【讨论】: