如果我保护一个数组并重新加载它,如果它未知,是否有可能获得大小? 感谢
答案 0 :(得分:4)
“未知”是什么意思?您可以使用长度字段获取任何java数组的长度。
int[] myArray = deserializeSomeArray();
int size = myArray.length;
答案 1 :(得分:1)
这听起来像是在序列化并将各个对象存储在数组中(在线之间进行大量读取之后)。使用ObjectOutputStream存储数组本身。如果存储在数组中的对象是可序列化的,那么它们也将被存储。反序列化时,您将完整地恢复整个阵列。
答案 2 :(得分:0)
我认为您需要提供更多信息。你是如何保存阵列的?使用ObjectOutputStream?
答案 3 :(得分:0)
否,因为数组的长度只是分配的内存大小除以存储在其中的对象的大小,并且因为没有对象的大小为0,所以总是有一个合适的长度(可能是0) )
答案 4 :(得分:0)
如果您使用ObjectInputStream.readObject()来读取已保存的数组,它将使用适当的长度重新构建,您只需使用array.length读取大小即可。
答案 5 :(得分:0)
尝试阅读各行......
如果你实际上在读数组,那么(与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);
}
如果要做那样的事情,最好在实际数据之前写出你要读作的对象数量。