Вопрос

Возможно ли сделать ObjectOutputStream /ObjectInputStream внутренним классом?Я могу записать это нормально и проверить созданный файл, но когда я пытаюсь прочитать его обратно с помощью ObjectInputStream, я получаю исключение EOFException, просто пытаясь прочитать объект o = oos.readObject();

  1. Я использую один и тот же файловый объект для открытия обоих потоков, так что проблема не в этом.
  2. Кажется, это не зависит от природы внутреннего класса - класс, содержащий только общедоступный int, терпит неудачу так же, как и более сложный класс.

Я должен двигаться дальше, и создать обычный класс, и создать экземпляр в классе sender, но я ненавижу уходить, не зная, возможно ли это, и если нет, то почему бы и нет.

Обновить:Связанные проблемы, которые были причиной проблемы:

A.Вы не можете повторно открыть файл, написанный с помощью ObjectOutputStream, и добавить:записывается второй заголовок, который повреждает файл.

B.Сериализация хэш-карты с использованием ByteOutputStream для выполнения хэш-дайджеста не работает, потому что, когда вы считываете хэш-карту обратно из файла ObjectOutputStream, вы вполне можете получить другой байт[] из ByteOutputStream из-за различий в порядке пар:содержимое то же самое, но байт [] (и, следовательно, хэш disgest) - нет.

Надеюсь, это поможет кому-нибудь сэкономить немного времени.

Это было полезно?

Решение

Это работает для меня.Пожалуйста, обратите внимание на любые различия в вашем решении.

public class Example implements Serializable {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        new Example().run();
    }

    private void run() throws IOException, ClassNotFoundException {
        Inner inner = new Inner();
        inner.x = 5;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream outputStream = new ObjectOutputStream( out );
        outputStream.writeObject( inner );

        ByteArrayInputStream in = new ByteArrayInputStream( out.toByteArray() );
        ObjectInputStream inputStream = new ObjectInputStream( in );
        Inner inner2 = (Inner) inputStream.readObject();

        System.out.println( inner2.x );
    }

    class Inner implements Serializable {
        int x;
    }
}

Другие советы

Можете ли вы включить небольшой фрагмент примера кода?Наиболее очевидным объяснением является то, что вы не закрываете / сбрасываете выходной поток, прежде чем пытаться прочитать его обратно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top