С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346

Десериализация не получается

07.02.2016, 17:37. Показов 2102. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите советом пожалуйста. Выкидывает exception. Десериализуеться только 1 объект вот код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 arr.clear();
                    countEntry = msgCountEntry();
                    Car obj = null;
                    try {
                        FileInputStream fis = new FileInputStream("test.data");
                        ObjectInputStream ois = new ObjectInputStream(fis);
                        for (int i = 0; i < countEntry; i++) {
                            obj = (Car) ois.readObject();
                            arr.add(obj);
                        }
                        ois.close();
                        fis.close();
                    } catch (IOException i) {
                        i.printStackTrace();
 
                    } catch (ClassNotFoundException c) {
                        System.out.println("Car class not found");
                        c.printStackTrace();
                    }
                    for (Car car : arr) {
                        System.out.println(car.getCarBrand());
                    }
                    System.out.format("число записей = %d", countEntry);
по отладчику ошибка тут
obj = (Car) ois.readObject();
и ещё exception
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(Ob jectInputStream.java:1379)
at java.io.ObjectInputStream.readObject(Obj ectInputStream.java:371)
at com.company.Main.main(Main.java:47)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.02.2016, 17:37
Ответы с готовыми решениями:

Десериализация
Ниженаписанный код программы выводит на экран: 14 16 -2 11 11 Объясните,пожалуйста, от куда взялось значение -2 и как дальше...

Десериализация
Всем привет. Помогите разобраться. Я сериализую лист в xml. После этого я десериализую его и добавляю новый элемент. Но в листе он не...

Десериализация
Предположим, создал класс public class OrderedItem1 { public string Name; public string Content; ...

16
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
07.02.2016, 17:57
Использовать при записи AppendableObjectOutputStream вместо ObjectOutputStream.
1
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
07.02.2016, 18:01  [ТС]
Можете привести пример кода? Что-то IDE не разпознаёт такого класса
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
07.02.2016, 18:08
оказывается это нестандартный класс.

Проблема в том что нельзя записывать несколько объектов в потом подряд без закрытия потока.

Как альтернативное решение предлагается класс AppendingObjectOutputStream наследник ObjectOutputStream.

Вот он:

Java
1
2
3
4
5
6
7
8
9
10
11
public class AppendingObjectOutputStream extends ObjectOutputStream {
 
  public AppendingObjectOutputStream(OutputStream out) {
    super(out);
  }
 
  @Override
  protected void writeStreamHeader() throws IOException {
    reset();
  }
}
1
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
07.02.2016, 18:35  [ТС]
Этот код я написал у меня не распознаёт в main
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 Car obj = null;
                    try {
                        FileInputStream fis = new FileInputStream("test.data");
                        AppendableObjectOutputStream ois = new AppendableObjectOutputStream(fis);
                        for (int i = 0; i < countEntry; i++) {
                            obj = (Car) ois.readObject();
                            arr.add(obj);
                        }
                        ois.close();
                        fis.close();
                    } catch (IOException i) {
                        i.printStackTrace();
 
                    } catch (ClassNotFoundException c) {
                        System.out.println("Car class not found");
                        c.printStackTrace();
                    }
подсвечиваеться это AppendableObjectOutputStream ois = new AppendableObjectOutputStream(fis);


Error47, 44) java: cannot find symbol
symbol: method readObject()
location: variable ois of type com.company.AppendableObjectOutputStream
Error45, 93) java: incompatible types: java.io.FileInputStream cannot be converted to java.io.OutputStream

Добавлено через 14 минут
оказывается это нестандартный класс.

Проблема в том что нельзя записывать несколько объектов в потом подряд без закрытия потока.

Как альтернативное решение предлагается класс AppendingObjectOutputStream наследник ObjectOutputStream.

Вот он:

Java(TM) 2 Platform Standard Edition 5.0
Выделить код

Java
1
2
3
4
5
6
7
8
9
10
11
public class AppendingObjectOutputStream extends ObjectOutputStream {
 
  public AppendingObjectOutputStream(OutputStream out) {
    super(out);
  }
 
  @Override
  protected void writeStreamHeader() throws IOException {
    reset();
  }
}
Подождите , а при чём тут OutPutSream?

Добавлено через 4 минуты
Вообще идей у меня нет , чего оно только один объект десериализует?
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
07.02.2016, 18:38
Файл неправильно записан - поэтому и не читается.
Надо исправлять запись, а не чтение.
Надо записывать при помощи AppendingObjectOutputStream, а не читать.

Цитата Сообщение от vifelso Посмотреть сообщение
Вообще идей у меня нет , чего оно только один объект десериализует?
Потому что только один записан правильно. Чтение вероятно правильно сделано.
0
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
07.02.2016, 19:20  [ТС]
Ошибка точно в записи , а не в чтении?
Просто в файле оно всё пишет! Мне кажется ошибка в чтении.

Добавлено через 26 минут
ну счас попробую с записью переделать(
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
07.02.2016, 19:22
Первый объект в файл надо писать через ObjectOutputStream.
Все последующие через AppendingObjectOutputStream.

Это точно работает. Я проверил.

Но мне кажется это некрасивым решением. Надо разобраться почему вообще эта хрень возникает.
1
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
07.02.2016, 19:33  [ТС]
Можете свой код скинуть? У меня ошибка возникает в классе AppendingObjectOutputStream с out
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
07.02.2016, 19:47
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        List<Car> arr=new ArrayList<>();
 
        arr.add(new Car("Car1", 1, 1981));
        arr.add(new Car("Car2", 2, 1982));
 
        try {
            FileOutputStream fos = new FileOutputStream("D:\\test.data", true);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(arr.get(0));
            oos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        try {
            FileOutputStream fos = new FileOutputStream("D:\\test.data", true);
            ObjectOutputStream oos = new AppendingObjectOutputStream(fos);
            oos.writeObject(arr.get(0));
            oos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

сюда пришлось дописать "throws IOException":
Java
1
2
3
4
5
6
7
8
9
10
11
class AppendingObjectOutputStream extends ObjectOutputStream {
 
    public AppendingObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }
 
    @Override
    protected void writeStreamHeader() throws IOException {
        reset();
    }
}
1
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
07.02.2016, 19:57  [ТС]
не, всё тоже самое у меня. Понимаете вы всё делаете с новыми потоками, попробуйте добавить тоже самое с помощью цикла всё в одном try-catch не закрывая потоков.
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
07.02.2016, 20:27
Старый файл надо удалить.

Если не закрывая потоков за раз все объекты записывать, то AppendingObjectOutputStream вообще не нужен.

Суть проблемы: ObjectOutputStream пишет сначала некий заголовок (несколько байт) первый раз после открытия, потом объекты.

Если записать объект, закрыть поток, открыть и записать снова объект, то запишется второй заголовок после первого объекта - и файл будет испорчен, т.к. заголовок должен быть только один в начале файла.

Для того чтобы заголовок не записывался был создан AppendingObjectOutputStream, где запись заголовка отключена. Но если первый объект в файле записать с помощью AppendingObjectOutputStream то заголовка вообще не будет. Что тоже ошибка, но уже другая.
1
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
07.02.2016, 20:43  [ТС]
Ага спасибо большое, вот терь я понял смысл проблемы . Я тоже смотрел на этот файл и думал почему у меня такая большая первая запись и тоже пришёл к выводу что оно вроде как обозначает название, а про AppendingObjectOutputStream не знал . Счас попробую.

Добавлено через 5 минут
А что в заголовке храниться , может тип объекта потеряется?
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
07.02.2016, 20:57
Нет, заголовок к объекту не относится, он ко всему файлу относится.
Там просто две константы по два байта.

Вот метод класса ObjectOutputStream который пишет заголовок.

JSON
1
2
3
4
protected void writeStreamHeader() throws IOException {
    bout.writeShort(STREAM_MAGIC);
    bout.writeShort(STREAM_VERSION);
}
1
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
07.02.2016, 21:34  [ТС]
не читает он(, блин может есть возможность сразу весь массив считать?
Я уже проверку на длину сделал типо если первый елемент то мы пишем с помощью ObjectOutputStream а если нет то с помощью AppendingObjectOutputStream

Добавлено через 9 минут
java.io.StreamCorruptedException: invalid stream header: 73720018
at java.io.ObjectInputStream.readStreamHead er(ObjectInputStream.java:806)
at java.io.ObjectInputStream.<init>(ObjectI nputStream.java:299)
at com.company.Main.main(Main.java:46)

Добавлено через 45 секунд
Я вот думаю а что если ArrayList передать сразу?
А как тогда считать ?)

Добавлено через 1 минуту
клоном!

Добавлено через 2 минуты
не , клон - отпадает!
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
07.02.2016, 21:41
Если записывать весь массив целиком, то и считать можно целиком.

Цитата Сообщение от vifelso Посмотреть сообщение
java.io.StreamCorruptedException: invalid stream header: 73720018
эта ошибка возникает когда в начале файла нет заголовка.
надо убедится что для записи первого объекта в новый файл вызывается оригинальный ObjectOutputStream.

Код покажите какой сейчас для записи.
0
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
07.02.2016, 21:58  [ТС]
Я его стёр полностью. Но по отладчику даже не пишет 1-ый элемент сразу ексепшн(, сейчас пробую через ArrayList всё сразу передать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2016, 21:58
Помогаю со студенческими работами здесь

Десериализация .ser
Есть файл .ser, выдернутый из .jar архива. Есть варианты как просматреть в читаемом формате, что находется в .ser? Зарание спасибо.

Десериализация XML
Пытаюсь десереализировать XML структуру, но или получаю неверное соответствие значений или не получаю ничего. Подскажить на каком моменте...

Десериализация XML
Здравствуйте! Добавлено через 27 секунд Решил(

Десериализация XML
есть XML документ, изменить формат не получится &lt;Points&gt; &lt;Point IsRequired=&quot;1&quot; X=&quot;0&quot; Y=&quot;0&quot; Z=&quot;0&quot;/&gt; ...

Десериализация JSON
Как для такого формата класс создать? , , ] исп. Newtonsoft.Json var myclass =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru