Сериализация ArrayList и добавление нового ArrayList - PullRequest
0 голосов
/ 19 апреля 2019

Я могу сериализовать ArrayList для первого запуска.Он сохраняет список клиентов в первый раз, когда создается файл data.ser.В других случаях он не добавляет новый ArrayList клиентов.

    public void serializeBank(ArrayList<Customer> newCustomers) {
        try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("data.ser", true))) {
            os.writeObject(newCustomers);
        } catch (IOException i) {
            i.getMessage();
        }
    }

Или мне нужно добавить новых клиентов в список массивов существующих клиентов и передать этот обновленный массив в метод сериализации?Хотя перезапись нового файла при каждом добавлении нового клиента работает, я хочу знать, есть ли способ добавить новых клиентов в существующий файл.

Ответы [ 3 ]

0 голосов
/ 19 апреля 2019

Вы должны добавить своих новых клиентов в список массивов существующих клиентов и передать его своему методу

0 голосов
/ 19 апреля 2019

Сначала

Вы не можете добавлять какие-либо данные в файл, используя разные ObjectOutputStream с.Вы можете прочитать эти вопросы StackOverflow Добавление к ObjectOutputStream & java.io.StreamCorruptedException: недопустимый код типа: AC , чтобы понять, почему вы не можете этого сделать.Но вкратце это потому, что каждый новый ObjectOutputStream будет добавлять свой заголовок к файлу, который будет его повреждать.Поэтому вы должны использовать один экземпляр ObjectOutputStream для записи всех ваших объектов в файл.

Во-вторых

Вы не можете сериализовать несколько объектов Customer и десериализоватьони как один ArrayList<Customer> объект.Потому что сериализованные данные разных объектов сильно отличаются.Каждые сериализованные данные содержат метаданные о сериализованном типе объекта, именах полей, типах полей и т. Д. Каким-то образом ObjectOutputStream отмечает начало и конец каждого сериализованного объекта, а ObjectInputStream используетчто маркеры, чтобы знать, как десериализовать объекты.Это означает, что если вы напишите 2 объекта в ObjectOutputStream, ваш ObjectInputStream будет читать эти 2 объекта отчетливо.

То есть , если вы хотите сериализовать несколько объектов Customer изатем десериализовать их как один ArrayList<Customer>, затем вы должны реализовать свою собственную логику сериализации / десериализации.

В качестве альтернативы вы можете добавить новый Customer к ArrayList, а затем стереть все содержимое файла и выделить ArrayList в этот файл, но это приведет к проблемам с производительностью.

0 голосов
/ 19 апреля 2019

Необходимо добавить новых клиентов в список массивов существующих клиентов и передать этот обновленный массив в метод сериализации.

...