我有一系列对象,它们通过DataOutputStream将数据写入文件。
随着我的应用程序文件格式的发展,我将向其中添加更多数据对象,这些对象应该可以被更早的数据对象读取。应用程序的版本。
为了能够做到这一点,我需要在对象数据前面加上一个大小值,表示当前对象将占用的字节数。
但是,由于这些数据可以是一个可变大小,特别是在处理字符串时,我无法事先知道它的大小。
有没有办法预先写"到一个字节缓冲区,好像它是一个DataOutputStream(特别是方法 - writeByte,writeShort,writeInt,writeUTF ),这将使我能够在将数据写入之前返回数据的字节长度。 DataOutputStream?这样做可以让我跳过旧版本的应用程序理解的新数据对象。
答案 0 :(得分:1)
由于各种原因,常规Java序列化并不是那么好。其中最重要的一点是它非常脆弱,并且往往不是“未来证据”。如果可能的话,我建议你使用不同的序列化格式,特别是如果你特别提到你计划在你序列化的类中添加字段。
Protobuf和JSON等格式的Java库具有良好的API,以及良好的前向/后向兼容性功能。在大多数情况下,将数据序列化为更方便的格式要比解决现有问题简单得多。
答案 1 :(得分:0)
正如您所见here,您可以这样使用java.lang.instrument.Instrumentation
:
import java.lang.instrument.Instrumentation;
public class ObjectSizeFetcher {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}
然后计算对象的字节大小:
public static void main(String [] args) {
Object myObject = ...;
System.out.println(ObjectSizeFetcher.getObjectSize(myObject));
}