Ява - IO на внутренний класс - PullRequest
1 голос
/ 22 октября 2009

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 23 октября 2009

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

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;
    }
}

2 голосов
/ 23 октября 2009

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

...