什么是Java中的序列化?

时间:2009-03-03 23:13:23

标签: java

  

可能重复:
  What is object serialization?

我使用Swing创建了一个小型RSS阅读器应用程序,Eclipse一直告诉我“可序列化类MochaRSSView没有声明类型为long的静态最终serialVersionUID字段”

什么是序列化以及它有什么好处?

7 个答案:

答案 0 :(得分:41)

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

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

(注意:所有非临时成员变量必须是可序列化的类,否则你会得到一个错误 - 因为JVM将通过结构递归写出每个对象的状态,直到写入基元的级别为止ObjectOutputStream)。

答案 1 :(得分:28)

Java序列化-----你见过序列化对象里面有什么东西吗?我将向您解释什么是java序列化,然后为您提供序列化的示例。最重要的是,让我们探索序列化对象内部的内容及其含义。这是java序列化的内部,它是如何工作的。如果您想拥有自己的java序列化实现,本文将为您提供一个很好的平台来启动。

什么是Java序列化? java序列化的主要目的是将对象写入流中,以便可以通过网络传输该对象,并且可以再次重建该对象。当涉及两个不同的方时,您需要一个协议来重新生成完全相同的对象。 Java序列化API就是为您提供的。您可以使用序列化功能的其他方法是,您可以使用它来执行深层复制。

为什么我在上面的定义中使用'主要用途',有时人们使用java序列化作为数据库的替代品。只是一个占位符,您可以在其中跨会话持久保存对象。这不是java序列化的主要目的。有时,当我采访Java候选人时,我听到他们说java序列化用于存储(保存状态)一个对象并检索它。他们与数据库同义使用它。这是对序列化的错误认识。

你如何序列化? 如果要序列化对象,则相应的类应实现可序列化的标记接口。它只是通知编译器这个java类可以被序列化。您可以标记不应序列化为瞬态的属性。您打开一个流并将对象写入其中。 Java API负责序列化协议,并将java对象保存在符合协议的文件中。反序列化是将对象从文件恢复到其原始形式的过程。

这里的协议意味着,序列化人与反序列化人之间的理解。包含序列化对象的文件内容是什么?

答案 2 :(得分:6)

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

答案 3 :(得分:6)

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

可序列化类的最佳做法是将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();
}

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

答案 4 :(得分:5)

Serialization是将对象转换为磁盘可存储格式的过程,以便稍后重新加载。查看链接以获取更多信息!

答案 5 :(得分:2)

序列化是一种获取对象(类的一个实例)并将其设置为传输的方法 - 跨网络,到磁盘等。

答案 6 :(得分:2)

序列化是将对象实例的表示写入流(或者到字节序列)的过程。 看看Sun所说的内容:http://java.sun.com/developer/technicalArticles/Programming/serialization/