【问题标题】:What is serialization in Java? [duplicate]Java中的序列化是什么? [复制]
【发布时间】:2010-10-11 03:41:48
【问题描述】:

可能重复:
What is object serialization?

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

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

【问题讨论】:

  • 详细描述请参考可能重复。

标签: java


【解决方案1】:

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

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

(注意:所有非瞬态成员变量都必须是可序列化的类,否则会出错 - 因为 JVM 将通过结构递归写出每个对象的状态,直至将原语写入到ObjectOutputStream)。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      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();
      }
      

      它可能不是世界上经过深思熟虑的系统(尽管它比许多人认为的要好得多)。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          序列化是一种获取对象(您的类的实例)并将其设置为传输的方法——通过网络、到磁盘等。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2011-07-12
              • 2011-01-16
              • 2014-01-31
              • 2012-01-17
              • 2011-04-14
              • 2011-08-05
              • 2011-11-15
              • 2011-01-15
              • 2011-01-11
              相关资源
              最近更新 更多