紧凑的Java外化

时间:2015-04-14 09:16:13

标签: java serialization

我试图找到一种方法来紧凑地序列化简单的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,结果证明比我更害怕]

0 个答案:

没有答案