如果我保护一个数组并重新加载它,如果它未知,是否有可能获得它的大小?谢谢
wellenreiter
问问题
1051 次
6 回答
4
“未知”是什么意思?您可以使用长度字段获取任何 java 数组的长度。
int[] myArray = deserializeSomeArray();
int size = myArray.length;
于 2008-10-06T10:25:23.463 回答
1
听起来您正在序列化并将单个对象存储在数组中(在行间大量阅读之后)。使用 ObjectOutputStream 来存储数组本身。如果存储在数组中的对象是可序列化的,它们也会被存储。当您反序列化时,您将完整地恢复整个数组。
于 2008-10-06T12:43:14.667 回答
0
我认为您需要提供更多信息。你是如何保存数组的?使用对象输出流?
于 2008-10-06T11:00:45.933 回答
0
不,因为数组的长度只是分配的内存大小除以存储在其中的对象的大小,并且由于没有对象的大小为 0,因此您将始终具有适当的长度(可能为 0)
于 2008-10-06T11:03:58.143 回答
0
如果您使用 ObjectInputStream.readObject() 读取保存的数组,它将以适当的长度重新构成,您可以使用 array.length 读取大小。
于 2008-10-06T11:25:28.223 回答
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);
}
如果你要做那种事情,最好在实际数据之前写出你要读取的对象数量作为 int。
于 2008-10-06T12:29:51.947 回答