【问题标题】:What differences are between ObjectInput/OutputStream and DataInput/OutputStream when applying to instances of primitive types?应用于基本类型的实例时,ObjectInput/OutputStream 和 DataInput/OutputStream 有什么区别?
【发布时间】:2019-05-19 10:55:48
【问题描述】:

在我看来ObjectInputStream/ObjectOutputStreamDataInputStream/DataOutputStream 都可以应用于原始类型的实例。 当ObjectInputStream/ObjectOutputStreamDataInputStream/DataOutputStream 都适用于原始类型的实例时,它们之间有什么区别?

它们能否以相同的方式(反)序列化原始类型的实例?

【问题讨论】:

    标签: java serialization io


    【解决方案1】:

    您可以通过快速测试轻松发现这一点:

    import java.io.*;
    
    public class Test {
        public static void main(String[] args) {
            try {
                ObjectOutputStream out1 = new ObjectOutputStream(new FileOutputStream("1.out"));
                out1.writeByte(100);
                out1.close();
    
                DataOutputStream out2 = new DataOutputStream(new FileOutputStream("2.out"));
                out2.writeByte(100);
                out2.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    

    当你运行这段代码时,你会直接看到不同之处: ObjectOutputStream 的文件更大。 ObjectOutputStream 总共写入 7 个字节,而不是 DataOutputStream 正在写入的一个字节。

    ObjectOutputStream 不仅仅是写入核心数据。它使用 Java 对象序列化流协议,可以在 https://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html#10258 找到。

    【讨论】:

      【解决方案2】:

      注意:不要使用 Java 序列化。 DataOutputStream 也有一些古怪的格式,所以也不要使用它。

      DataOutputStreamOutputStream 之上提供了一个层,支持按 Java 类文件的要求格式化数据。它不添加任何标签/元数据,它只是以标准格式写入数据。它显然是公开的早期编译器的一部分,因为它可能很有用——典型的 JDK1.00 类。

      ObjectOutputStreamDataOutputStream 之上提供了一个层(不必用该类实现,但低级数据格式相同),支持写入包含任意对象数据的特定文件格式。与大多数格式一样,这包括一组标题。

      当您将对象写入ObjectOutputStream 时,如果自上次reset 以来一直使用它,它还将写入类描述或引用。 “数据”方法被指定为与DataOutputStream 大致相同的格式,但文件已经有一个标题。这些方法通常用于defaultWriteObjectwriteFields 之后的自定义writeObject 方法中。

      tl;dr 有一个带有ObjectOutputStream 的标题; ObjectOutputStreamDataOutputStream 之上的(渗透)层。

      【讨论】:

      • 谢谢。 Java 序列化的推荐方式有哪些?
      • @Ben 目前每个人似乎都在使用 JSON。不幸的是,这并不能很好地指定格式 - 它并没有比DataOutputStream 更高级别。有 加载 种用于 JSON 的 Java 库,我真的无法帮助您在它们之间进行选择。
      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2014-05-01
      • 2012-02-13
      • 2019-07-31
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      相关资源
      最近更新 更多