Java: Сериализация неизвестного массива - PullRequest
0 голосов
/ 06 октября 2008

Если я сохраню массив и перезагрузлю его, есть ли возможность получить размер, если он неизвестен? Спасибо

Ответы [ 6 ]

4 голосов
/ 06 октября 2008

Что вы подразумеваете под "неизвестным"? Вы можете получить длину любого Java-массива с помощью поля длины.

int[] myArray = deserializeSomeArray();
int size = myArray.length;
1 голос
/ 06 октября 2008

Похоже, что вы сериализуете и храните отдельные объекты в массиве (после большого чтения между строк). Используйте ObjectOutputStream для хранения самого массива. Если объекты, хранящиеся в массиве, являются сериализуемыми, они также будут сохранены. При десериализации вы получите весь массив обратно без изменений.

0 голосов
/ 06 октября 2008

Попытка чтения между строк ...

Если вы на самом деле читаете массив, то (в отличие от 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);
}

Если вы собираетесь делать такие вещи, гораздо лучше записать число объектов, которые вы собираетесь прочитать, как целые, перед фактическими данными.

0 голосов
/ 06 октября 2008

Если вы используете ObjectInputStream.readObject () для чтения сохраненного массива, он будет восстановлен с правильной длиной, и вы можете просто прочитать размер с помощью array.length.

0 голосов
/ 06 октября 2008

Нет, потому что длина массива - это просто размер выделенной памяти, деленный на размер объекта, хранящегося в нем, и, поскольку ни один из объектов не имеет размер 0, вы всегда будете иметь правильную длину (которая может быть 0 )

0 голосов
/ 06 октября 2008

Я думаю, вам нужно предоставить больше информации. Как вы сохраняете массив? Используя ObjectOutputStream?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...