【问题标题】:Customizing Java Serialization自定义 Java 序列化
【发布时间】:2011-09-14 19:15:20
【问题描述】:

我正在查看blog,我想到了一个问题。是否可以覆盖 ObjectOutputStream 的写入方式。

假设我正在写入文件 out.dat,即

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\out.dat")));
out.writeObject(o);

当我在 Notepad++ 中打开文件 out.dat 时,我看到了二进制数据。这是有道理的。如果,我想自定义写入这些数据的方式。假设我想要 JSON 格式的 out.dat 文件(这只是一个示例,它可以是任何其他格式)。我应该覆盖什么方法来做到这一点?

【问题讨论】:

    标签: java serialization object customization


    【解决方案1】:

    您可以通过实现 Externalizable 并覆盖 writeExternal 和 readExternal 方法来做您想做的事。详情请见http://download.oracle.com/javase/7/docs/platform/serialization/spec/output.html#3146

    请注意,它允许自定义一个对象的序列化输出,但不能自定义整个流的格式。因此,您将在其他二进制数据中找到您的 JSON 字符串。

    【讨论】:

      【解决方案2】:

      我认为您应该这样做,因为这种格式用于保持层之间的通信(与网络上的分布式对象一起使用)。您可以做的只是创建一个处理程序,使用您的漂亮格式将您的对象存储在一个文件中。

      【讨论】:

      • 他为什么不这样做呢?它不是最有效的传输(但也不是默认的 java 序列化),但它在 Web 上经常使用,这不是什么大问题。只要他做对了,数据传输时的样子就很无趣了。
      【解决方案3】:

      您可以使您的对象实现Externalizable 并完全控制序列化。使用例如在实现 readExternal / writeExternal 方法时,google-gson 用于 JSON。

      【讨论】:

        【解决方案4】:

        在您正在寻找自定义序列化机制的场景中,我建议您实现Externalizable 接口并提供方法的实现

        public void writeExternal(ObjectOutput out) throws IOException

        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

        在这种情况下如何序列化完全取决于您。

        【讨论】:

          【解决方案5】:

          我很确定 java 没有对序列化为 JSON 的内部支持。在我看来,你最好的选择是创建一个获取 JSON 的接口,并让你想要序列化为 JSON 的任何对象实现这个接口:

          public interface IJSONSerializable{
              public String getSerializedForm();
          }
          

          然后使用基本的FileOutputStream 进行输出,因为(据我所知)ObjectOutputStream 用于将对象序列化为二进制,并且不具备对 JSON 的固有支持。

          其他想法

          如果您选择采用这种方式,您可以编写一个帮助类来写出诸如属性和值之类的内容。

          【讨论】:

            【解决方案6】:

            Java 本身没有对 JSON 序列化的内置支持,但我相信您可以找到执行此操作的框架 - 或者自己为简单的类编写它。

            所以对于任何你想以 JSON 格式序列化的类,只需覆盖

             private void writeObject(java.io.ObjectOutputStream out)
                 throws IOException
             private void readObject(java.io.ObjectInputStream in)
                 throws IOException, ClassNotFoundException;
            

            如果有一些 JSON 框架可以为您提供字符串格式的一个实例的数据,反之亦然。

            【讨论】:

              猜你喜欢
              • 2011-11-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-11
              相关资源
              最近更新 更多