布尔值是将对象属性标记为NULL
的标准过程。
考虑以下情况:
public class LongMessage implements Writable {
private long tag;
private String data;
// interface methods omitted first
}
因为某些原因,data
可能为null
。我将按以下方式实现读/写:
@Override
public void readFields(DataInput in) throws IOException {
tag = in.readLong();
if (in.readBoolean()) {
data = in.readUTF();
} else {
data = null;
}
}
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(tag);
if (data != null) {
out.writeBoolean(true);
out.writeUTF(data);
} else {
out.writeBoolean(false);
}
}
即使这段代码比较易读,但需要注意的是,根据JavaDocs中#writeBoolean
的说明,每个记录的常量开销为一字节:
将布尔值写入此输出流。如果参数v为true,则写入值(byte)1;如果v为false,则写入值(byte)0。
在进行串行化时,Java对象序列化协议中,一个null对象的大小恰好为1字节。因此,在您自定义的Writable
的write
方法中,我认为您不会遇到任何问题。
一般来说,这确实取决于您要建模的内容。如果您要表示一个Boolean
,而null表示不存在,那么您应该将其默认为false。如果是整数,则应将其默认为数据集的默认值。所以,除非特定的"特殊意义"与之相关联,否则我认为您可以写入一个null,否则您应该使用一个默认值。