Java 当我们可以直接使用DataInput和DataOutput时,为什么要使用Writable?

Java 当我们可以直接使用DataInput和DataOutput时,为什么要使用Writable?,java,hadoop,serialization,java-io,writable,Java,Hadoop,Serialization,Java Io,Writable,可能是因为实现Writable将为我们提供一个可序列化的对象。我知道DataInput和DataOutput直接处理字节流,但我认为直接从字节流中读取值并将其存储在基元类型中没有什么害处 话虽如此,使用readFields()和write()方法似乎是徒劳的,只能从模块化的角度使用。为实例变量的DataInput和DataOutput类创建对象,并直接获取输入(像Scanner实用程序类一样使用DataInput和DataOutput)似乎非常简单。就我所见,为它们创建一个接口并实现那些显而易见

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

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

如果有什么要看的,帮我看穿它


更新
数据输入
数据输出
类生成序列化对象!:o

数据输出
数据输入
仅序列化/反序列化最基本的类型,即基本类型,而不是自定义或复杂对象


这就是为什么通过实现
Writable
,并依次实现其方法
readFields(DataInput in)
write(DataOutput out)
,我们可以序列化我们自己类的成员/实例变量并遍历它们的输入或输出。由于可写文件是为特定的类编写的,因此它们紧凑、小,因此提供了更高的性能,因为我们不必存储该类类型的metdata,并且与其他类相比,可以在分布式网络上轻松地进行流式传输

writeable
不会生成可序列化对象,也不会生成
DataInput
DataOutput
。不清楚你在说什么,更不用说你在问什么了。可能是重复的。@EJP它们都有。和。你第二个评论的问题是关于其他的东西。不要只看标题!不,
writeable
可以,在Hadoop中,通过使用
DataOutput
接口,以及进入时的
DataInput
,用于Hadoop的序列化协议
DataInput/Output
本身并没有任何这样神奇的特性,当然它们都不代表“语法糖”。您的问题很混乱。@EJP我提到了几个链接。第一个直接提到它们序列化了最基本的类型。如果你想要官方网站的文字,你可以看到他们直接读写字节流。