我试图找到一种方法来紧凑地序列化简单的Java对象(即所有字段都是原始类型),而没有通常在使用writeExternal时添加的大标题。它不需要是超级通用的,向后兼容版本,或类似的东西,我只是希望它与ObjectOutputStreams(或类似的东西)一起工作,而不是在我序列化的每个对象的大小上添加~100个字节。
更具体地说,我有一个有3个成员的类:一个布尔标志和两个长号。我应该能够以17个字节表示这个对象。以下是代码的简化版本:
class Record implements Externalizable {
bool b;
long id;
long uid;
public void writeExternal(ObjectOutput out) throws IOException {
int size = 1 + 8 + 8; //I know, I know, but there's no sizeof
ByteBuffer buff = ByteBuffer.allocate(size);
if (b) {
buff.put((byte) 1);
} else {
buff.put((byte) 0);
}
buff.putLong(id);
buff.putLong(uid);
out.write(buff.array(), 0, size);
}
}
在其他地方,通过传递到如下方法中来存储它们:
public void store(Object value) throws IOException {
ObjectOutputStream out = getStream();
out.writeObject(value);
out.close();
}
在我以这种方式将这些对象中的一个存储在文件中之后,该文件的大小为128字节(其中两个为256字节,因此它不会分摊)。查看该文件,很明显它正在写入类似于默认序列化中使用的标题(对于记录,它使用大约376个字节来存储其中一个)。我可以看到我的writeExternal方法被调用(我输入了一些日志记录),所以这不是问题所在。这只是ObjectOutputStream反序列化方式的一个基本限制吗?我是否需要处理原始DataOutputStreams以获得我想要的那种紧凑性?
[编辑:如果有人想知道,我最终直接使用了DataOutputStreams,结果证明比我更害怕]