Просмотр документа, в котором объекты сериализуются

1

Я пишу программу, где объекты сериализуются в документе под названием "Books.ser"

FileOutputStream fos = new FileOutputStream("Books.ser");
ObjectOutputStream os = new ObjectOutputStream(fos);
for (int i = 1; i < 1000; i++) {
    os.writeObject(shelf.book[i]);
}
os.close();

Есть ли способ открыть и просмотреть этот документ? Если нет, я просто хотел бы знать, если Java сериализует объекты, которые еще не были инициализированы. (ноль)

  • 1
    Да, Java будет сериализовать нули. Когда вы читаете объект, приведите его к исходной форме, чтобы вы могли взаимодействовать с ним. Простой способ проверить, пишете ли вы null, состоит в том, чтобы проверить, содержат ли переменные объекты перед тем, как писать
  • 1
    Вместо сериализации всех элементов массива вы можете сериализовать массив (который будет сериализовать его элементы)
Показать ещё 1 комментарий
Теги:
serialization

1 ответ

1
Лучший ответ

Ну, противоположный цикл должен делать.

FileInputStream is = new FileInputStream("Books.ser");
ObjectInputStream ois = new ObjectInputStream(is);

for (int i = 1; i < 1000; i++) {
    Object o = os.readObject();
    // Do something with o - e.g. add to a List
}

ois.close();

Из JavaDoc:

ObjectOutputStream записывает примитивные типы данных и графики объектов Java в OutputStream. Объекты могут быть прочитаны (восстановлены) с помощью ObjectInputStream. Постоянное хранение объектов может быть выполнено с помощью файла для потока.

Итак, в основном вы пишете примитивы (например, writeInt) или объекты (writeObject) с ObjectOutputStream а затем вы читаете их с помощью ObjectInputStream с соответствующим read -methods.

Если OutputStream знает тип объекта, который должен быть сериализован, он также работает с нулевыми значениями. Например

public static class MyClass implements Serializable {
    private final String content;

    public MyClass(final String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }
}

@Test
public void testWriteObject() throws IOException, ClassNotFoundException {
    MyClass nullInstance = null;
    MyClass notNullInstance = new MyClass("This content is not null");

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (ObjectOutputStream os = new ObjectOutputStream(baos)) {
        os.writeObject(nullInstance);
        os.writeObject(notNullInstance);
    }

    try (ObjectInputStream is = 
                 new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {

        MyClass shouldBeNull = (MyClass) is.readObject();
        MyClass shouldNotBeNull = (MyClass) is.readObject();

        Assert.assertNull(shouldBeNull);
        Assert.assertNotNull(shouldNotBeNull);

        // Attributes are serialized too
        Assert.assertEquals("This content is not null", shouldNotBeNull.getContent());
    }
}

При использовании классов InputStream и OutputStream рекомендуется использовать конструкцию try-with-resources (от Java 7).

try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("Books.ser"))) {
    // loop and serialize...
} catch (IOException e) {
    // Handle exception
}
  • 0
    О да, я все это сделал. Мне просто интересно, если Java сериализует, а затем десериализует объекты, которые еще не были инициализированы (ноль).
  • 0
    @noobProgrammer - понял! Я обновил ответ, чтобы предоставить более подробный ответ. Атрибуты также сериализуются / десериализуются, нулевые значения обрабатываются (см. Предоставленный тестовый пример).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню