【发布时间】:2008-10-06 10:14:19
【问题描述】:
如果我保护了一个数组并重新加载它,如果它未知,是否有可能获得它的大小? 谢谢
【问题讨论】:
标签: java serialization objectsize
如果我保护了一个数组并重新加载它,如果它未知,是否有可能获得它的大小? 谢谢
【问题讨论】:
标签: java serialization objectsize
“未知”是什么意思?您可以使用长度字段获取任何 java 数组的长度。
int[] myArray = deserializeSomeArray();
int size = myArray.length;
【讨论】:
听起来您正在对数组中的各个对象进行序列化和存储(在行间大量阅读之后)。使用 ObjectOutputStream 来存储数组本身。如果存储在数组中的对象是可序列化的,它们也会被存储。当您反序列化时,您将完整地恢复整个数组。
【讨论】:
我认为您需要提供更多信息。你是如何保存数组的?使用 ObjectOutputStream?
【讨论】:
不,因为数组的长度只是分配的内存大小除以存储在其中的对象的大小,并且由于没有对象的大小为 0,因此您将始终具有适当的长度,(可能为 0 )
【讨论】:
如果您使用 ObjectInputStream.readObject() 读取保存的数组,它将以适当的长度重新构成,您可以使用 array.length 读取大小。
【讨论】:
正在尝试在字里行间阅读...
如果您实际上是在读取数组,那么(与 C 不同)所有数组都知道它们的长度。 Java 是一种安全的语言,所以长度是边界检查所必需的。
MyType[] things = (MyType[])in.readObject();
int len = things.length;
也许您的困难在于您正在进行自定义(反)序列化并且正在写出数组的各个元素(提示:不要 - 使用数组)。如果您需要捕获 OptionDataException 来检测封闭对象的自定义数据的结尾:
private static final MyType[] NOTHING = new MyType[0];
private transient MyType[] things = NOTHING;
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // Do not forget this call!
for (MyType thing : things) {
out.writeObject(thing);
}
}
private void readObject(
ObjectInputStream in
) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // Do not forget this call!
List<MyType> things = new ArrayList<MyType>();
try {
for (;;) {
things.add((MyType)in.readObject();
}
} catch (OptionalDataException exc) {
// Okay - end of custom data.
}
this.things = things.toArray(NOTHING);
}
如果您要执行此类操作,最好在实际数据之前将要读取的对象数量写为 int。
【讨论】: