[英]Wrapper around Java primitive types
我正在学习hadoop,并且只知道Java的基本概念。 在研究hadoop时,我发现hadoop使用自己的类型,例如Longwritable,Text etch,它们是Java基本类型的扩展或包装版本。
我在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中一样在网络上进行读写操作?
最后一个问题,相同的代码如何与完成序列化的计算机上的数据以及一旦到达那里的数据进行反序列化的网络上的另一台计算机通信? 这种链接如何在网络上以相同的代码进行序列化/反序列化?
为什么总是需要将数据转换为字节以进行序列化/反序列化?
序列化的目的是将数据发送到软件外部的某个位置(硬盘驱动器或其他软件的某个位置)。 这些过程将需要通用的低级数据表示形式,例如要传输的字节。
_
这些引用类型是字节流本身从它们读取或写入字节的地方吗? 我在这里感到困惑,如何生成字节流以像在hadoop中一样在网络上进行读写操作?
它们不是字节流。 它们是Java类,与其他任何类一样,但它们在内部保存字节流。 您可以检查这些接口的一种实现的代码,以查看它们如何更好地工作,例如DataInputStream,您将能够看到它们保存在字节数组中。 实际的字节读取和写入是非常底层的内容,我实际上不知道它是如何完成的,但是可以弄清楚是否继续深入研究这些实现。
_
相同的代码如何与完成序列化的计算机上的数据以及一旦到达那里的数据进行反序列化的网络上的另一台计算机通信?
为了能够反序列化对象,目标还必须具有用于序列化的相同Java对象。 为确保源和目标上的两个类均相等,因此反序列化时不会出现意外结果,建议您生成一个serialVersionUID,例如:
private static final long serialVersionUID = 3770035753852147836L;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.