アレイを安全にしてリロードした場合、サイズが不明な場合にサイズを取得する可能性はありますか?ありがとう
6 に答える
「不明」とはどういう意味ですか?長さフィールドを使用して、任意のJava配列の長さを取得できます。
int[] myArray = deserializeSomeArray();
int size = myArray.length;
個々のオブジェクトをシリアル化して配列に格納しているようです(行間をよく読んだ後)。ObjectOutputStreamを使用して、配列自体を格納します。配列に格納されているオブジェクトがシリアル化可能である場合、それらも格納されます。デシリアライズすると、アレイ全体が元の状態に戻ります。
行間を読み込もうとしています...
実際に配列を読み取っている場合は、(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として書き出す方がはるかに優れています。
もう少し情報を提供する必要があると思います。配列をどのように保存していますか? ObjectOutputStream を使用していますか?
いいえ、配列の長さは、割り当てられたメモリのサイズを格納されているオブジェクトのサイズで割ったものであり、サイズが 0 のオブジェクトがないため、常に適切な長さになります (0 の可能性があります)。
ObjectInputStream.readObject() を使用して保存された配列を読み取ると、適切な長さで再構成され、array.length でサイズを読み取ることができます。