【问题标题】:Why to use Writable when we can directly use DataInput and DataOutput?可以直接使用DataInput和DataOutput,为什么还要使用Writable?
【发布时间】:2016-11-13 04:57:49
【问题描述】:

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

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

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

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

【问题讨论】:

  • Writable 不会产生可序列化的对象,DataInputDataOutput 也不会。不清楚你在说什么,更不用说你在问什么了。
  • @EJP 他们都这样做。 Herehere。您的第二条评论的问题是在谈论其他事情。不要只看标题!
  • 不,Writable 确实如此,在 Hadoop 中,并且通过使用DataOutput 接口和DataInput 在途中, 用于 Hadoop 的序列化协议DataInput/Output 本身没有任何这种神奇的特性,当然它们都不代表“语法糖”。你的问题很困惑。
  • @EJP 我提到了几个链接。第一个直接提到他们序列化最基本的类型。而如果你想要官网的话,你可以看到他们直接read for write to 字节流

标签: java hadoop serialization java-io writable


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2012-08-03
    • 2010-12-26
    相关资源
    最近更新 更多