java - 可以直接使用DataInput和DataOutput,为什么还要使用Writable?

原文 标签 java hadoop serialization java-io writable

可能是因为实现 Writable会给我们一个可序列化的对象。我知道DataInputDataOutput直接处理字节流,但我认为直接从它们中读取值并将其存储在原始类型中也没有什么坏处。

话虽这么说,readFields()write()方法似乎是徒劳的,只能从模块化的角度使用。为 DataInput 创建对象和 DataOutput实例变量的类和直接获取输入(使用 DataInputDataOutput 就像 Scanner 实用程序类)似乎很简单。就我所见,为它们创建一个接口(interface)并实现那些明显的方法(无论是在预定义的盒子类还是我们自己的自定义类中)看起来就像语法糖。

如果有什么可以看的,请帮我看穿。

更新 : DataInputDataOutput类产生序列化的对象! :o

最佳答案

DataOutputDataInput仅对最基本的类型进行序列化/反序列化,即 原始类型 而不是自定义或复杂的对象。

这就是为什么通过实现 Writable ,然后是它的方法readFields(DataInput in)write(DataOutput out) ,我们可以序列化我们自己类的成员/实例变量,并遍历它们的输入或输出。而且由于 Writables 是为特定的类编写的,因此它们紧凑、小巧 (and not 5-bytes long)因此提供了更高的性能,因为与 Java Serializable 相比,我们不必存储类类型的元数据并允许通过分布式网络轻松流式传输。 .

关于java - 可以直接使用DataInput和DataOutput,为什么还要使用Writable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38303659/

相关文章:

java - 使用 .split (""从 Android Studio 接收的输入将 Java 中的字符串拆分为数组

java - Scala范围,初始化

ubuntu - 使用HDFS中的文件到Apache Spark

database - 将 MS Access 数据库对象序列化为文本文件

java - Google Analytics - 强制执行屏幕跟踪

java - 试图理解已经制作的 JApplet 代码

java - 从Scala访问HBase时发生了非法的反射访问操作

azure - 将HDInsight群集升级/迁移到最新版本

django - 如何使用嵌套对象序列化 Django 模型(Django REST Framework)

java - 带有 MongoDB、Jackson 和 MongoJack 的自定义序列化程序