我正在学习hadoop,只知道java的基本概念。在研究hadoop时,我发现hadoop使用了自己的类型,比如longwritable、text-etch,它们是java原语类型的扩展或 Package 版本。
我在java社区发布这个问题是因为我认为只有这些人可以消除我的疑虑。
我的意图是让它在全球范围内理解这个概念,不仅仅是因为它与hadoop相关,而且它听起来非常有趣,可以在任何地方使用,而不仅仅是在hadoop中。
在阅读时,我发现hadoop这样做是为了能够在网络上快速移动数据。它可以通过序列化和反序列化来实现。对于这个概念,可以使用dataoutput,它从任何java原语类型读取数据并转换为一系列字节,然后使用datainput再次读取这些字节并转换回其原始状态。
我这里的第一个问题是,为什么总是需要将数据转换为字节以进行序列化/反序列化?我在某处听说字节的重量比实际数据要低,所以这是唯一的原因?还有其他原因吗?
第二个问题,当我们做序列化和反序列化让我们说使用以下代码
public class LongWritable implements Writable {
// Some data
private int counter;
private long timestamp;
public void write(DataOutput out) throws IOException {
out.writeInt(counter);
out.writeLong(timestamp);
}
public void readFields(DataInput in) throws IOException {
counter = in.readInt();
timestamp = in.readLong();
}
public static LongWritable read(DataInput in) throws IOException {
LongWritable w = new LongWritable();
w.readFields(in);
return w;
}
}
所以这里我们使用datainput和dataoutput类型,它是指实现这些接口的类的对象。所以我的第二个问题是,这些引用类型本身是字节流吗?它们从哪里读写字节?我在这里很困惑,字节流是如何在这里生成的,以便像hadoop那样在网络上读写操作?
最后一个问题,同一代码如何与正在进行序列化的计算机上的数据通信,以及在数据到达后如何与正在进行反序列化的网络上的另一台计算机通信?这个链接是如何在网络上用相同的代码进行序列化/反序列化的?
1条答案
按热度按时间jc3wubiy1#
为什么总是需要将数据转换为字节以进行序列化/反序列化?
序列化的目的是将数据发送到软件之外的某个地方(硬盘或其他软件)。这些进程将需要一个通用的底层数据表示,比如要传输的字节。
_
这些引用类型本身是字节流吗?它们从何处读取或写入字节?我在这里很困惑,字节流是如何在这里生成的,以便像hadoop那样在网络上读写操作?
它们不是字节流。它们和其他类一样是java类,但它们在内部保存字节流。您可以检查这些接口的一个实现的代码,看看它们如何更好地工作,比如datainputstream,您将能够看到它们保存在字节数组中。以字节为单位的实际读写是非常低级的东西,我实际上不确定具体是如何完成的,但如果您继续深入研究这些实现,就有可能弄清楚。
_
同一代码如何与正在执行序列化的计算机上的数据通信,以及在数据到达后如何与正在执行反序列化的网络上的另一台计算机通信?
为了能够反序列化对象,目标还需要具有用于序列化的相同java对象。为了确保两个类在源和目标上都相等,以便在反序列化时不会得到意外的结果,建议您生成SerialVersionId,如: