java - ввод - вывод во внутреннем классе
-
05-07-2019 - |
Вопрос
Возможно ли сделать ObjectOutputStream /ObjectInputStream внутренним классом?Я могу записать это нормально и проверить созданный файл, но когда я пытаюсь прочитать его обратно с помощью ObjectInputStream, я получаю исключение EOFException, просто пытаясь прочитать объект o = oos.readObject();
- Я использую один и тот же файловый объект для открытия обоих потоков, так что проблема не в этом.
- Кажется, это не зависит от природы внутреннего класса - класс, содержащий только общедоступный 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; } }
Другие советы
Можете ли вы включить небольшой фрагмент примера кода?Наиболее очевидным объяснением является то, что вы не закрываете / сбрасываете выходной поток, прежде чем пытаться прочитать его обратно.