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

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

07.02.2016, 17:37. Показов 2100. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 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 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru