Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.83
MDmitry_
81 / 49 / 5
Регистрация: 01.10.2010
Сообщений: 464
#1

Десериализация. Конец потока обнаружен до завершения разбора - C#

05.03.2012, 02:01. Просмотров 5472. Ответов 21
Метки нет (Все метки)

При десереализации возникает следующая ошибка: Объект, не помечен, как сериализуемый. Конец потока обнаруен до завершения разбора.

На деле объект записывается с помощью библиотеки в специальный формат, на вход поступает массив байтов. Привёл код как будто бы сохраняется в двоичный файл, чтобы не перегружать незнакомым синтаксисом.

Сериализация производится по следующей цепочке: объект - сериализация (в Stream) - массив байтов - двоичный файл

C#
1
2
3
4
5
// В stream содержится результат сериализации объекта
FileStream TestFileStream = new FileStream("tree.bin",FileMode.Create);
byte[] array2 = stream.ToArray();
TestFileStream.Write(array2, 0, array2.Length);
TestFileStream.Close();
Десереализация Двоичный файл - массив байтов (byte[]) - stream - десереализация (объект)

C#
1
2
3
4
5
6
7
8
9
10
FileStream TestFileStream = new FileStream("tree.bin", FileMode.Open);
byte[] array2 = new byte[TestFileStream.Length];
TestFileStream.Read(array2, 0, array2.Length);
 
MemoryStream stream2 = new MemoryStream();
stream2.Write(array2, 0, array2.Length);
try
{
  treeNode = (TreeNode)deserializer.Deserialize(stream2);
}
P.S. При использовании двоичного файла происходит такая же ошибка

P.P.S. Знаю, что так проще

C#
1
2
FileStream TestFileStream = new FileStream("tree.bin", FileMode.Open);
treeNode = (TreeNode)deserializer.Deserialize(TestFileStream);
Но нужно использовать массив байтов, см. выше почему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2012, 02:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Десериализация. Конец потока обнаружен до завершения разбора (C#):

Бинарная сериализация - Error - Конец потока обнаружен до завершения разбора - C#
Делаю сетевую игру пинг-понг(вот похожая игра - http://channel9.msdn.com/coding4fun/articles/Upgrade-Your-Game-TinyTennis-C). Данные о игре...

Десериализация json. Ожидается элемент "root" из пространства имен "". Обнаружен элемент "None" - C#
Здравствуйте. Получаю от сервера ответ на запросы. В интернете нашел пример десериализации, и с одним все работает хорошо, но с другим есть...

Определить конец потока TcpClient - C#
Использую GetStream(), и выкачиваю данные оттуда. Проблема в том, что если не определить конец потока, то после завершения считывания...

Ошибка при закрытии соединения после завершения потока, где это соединение было открыто - C#
У меня в программе есть обновляющаяся статистика, и если пользователь запустил обновление, а потом поменял параметры статистики и запустил...

XML: обнаружен непредвиденный конец файла - Oracle
С помощью сервиса Яндекса хочу извлечь координаты по адресу следующим запросом: select...

Конец файла обнаружен раньше, чем левая { скобка - C++
Помогите исправить программу так,чтобы она работала. ( Программа для перевода числа в письменный вид) #include <iostream> #include...

21
freeba
Неадекват
1173 / 970 / 105
Регистрация: 02.04.2010
Сообщений: 2,239
Записей в блоге: 2
Завершенные тесты: 2
05.03.2012, 13:23 #2
Так и не нашел объявления deserializer. Весь код в студию - куски как-то не представляют всей картины.
0
m0nax
1161 / 862 / 56
Регистрация: 12.01.2010
Сообщений: 1,808
Завершенные тесты: 3
05.03.2012, 14:12 #3
C#
1
2
MemoryStream stream2 = new MemoryStream();
stream2.Write(array2, 0, array2.Length);
замени на
C#
1
MemoryStream stream2 = new MemoryStream(array2);
и все заработает
0
MDmitry_
81 / 49 / 5
Регистрация: 01.10.2010
Сообщений: 464
05.03.2012, 16:45  [ТС] #4
Цитата Сообщение от m0nax Посмотреть сообщение
замени на
Код C#1 MemoryStream stream2 = new MemoryStream(array2);
и все заработает
Конец потока обнаружен до завершения разбора. Не помогло

Добавлено через 1 минуту
Код полностью

Чтение. Чтение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
            BinaryFormatter deserializer = new BinaryFormatter();
            TreeNode treeNode = null;
            FileStream TestFileStream = new FileStream("tree.bin", FileMode.Open);
            byte[] array2 = new byte[TestFileStream.Length];
            TestFileStream.Read(array2, 0, array2.Length);
 
            //MemoryStream stream2 = new MemoryStream();
            //stream2.Write(array2, 0, array2.Length);
 
            MemoryStream stream2 = new MemoryStream(array2);
 
            try
            {
                treeNode = (TreeNode)deserializer.Deserialize(stream2);
            }
            catch (SerializationException ex)
            {
                MessageBox.Show(errorMessage + "Невозможно десериализовать объект. Объект не помечен, как сериализуемый. "
                    + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(errorMessage + "Невозможно десериализовать объект. " + ex.Message);
            }
 
            if (treeNode != null)
            {
                trvTree.Nodes.Add(treeNode);
                trvTree.ExpandAll();
            }
Добавлено через 1 минуту
Запись
C#
1
2
3
4
FileStream TestFileStream = new FileStream("tree.bin",FileMode.Create);
byte[] array2 = stream.ToArray();
TestFileStream.Write(array2, 0, array2.Length);
TestFileStream.Close();
0
freeba
Неадекват
1173 / 970 / 105
Регистрация: 02.04.2010
Сообщений: 2,239
Записей в блоге: 2
Завершенные тесты: 2
05.03.2012, 20:19 #5
Попробуйте так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static object SerializeFileToObject(string PathFile)
        {
            Stream stream;
            try //Перестраховка, путь задается OpenFileDialog
            {
                stream = File.OpenRead(PathFile);
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Exclamation); return null;
            }
 
            object ret = new BinaryFormatter() { }.Deserialize(stream);
            stream.Close();
 
            return ret;
        }
Возможно FileStream'у не нравятся какие либо байты.
0
MDmitry_
81 / 49 / 5
Регистрация: 01.10.2010
Сообщений: 464
05.03.2012, 22:52  [ТС] #6
нет, не помогло, а { } для чего?
0
freeba
Неадекват
1173 / 970 / 105
Регистрация: 02.04.2010
Сообщений: 2,239
Записей в блоге: 2
Завершенные тесты: 2
05.03.2012, 23:49 #7
привычка )))

Очень странно. Попробуйте тогда сериализовать в Stream, а не только извелкать им.
0
Konctantin
924 / 728 / 63
Регистрация: 12.04.2009
Сообщений: 1,700
06.03.2012, 10:08 #8
ужас, что вы тут наворотили?
вот, как ни странно, но все работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var tn = new TreeNode();
var node1 = tn.Nodes.Add("123");
node1.Nodes.Add("123");
node1.Nodes.Add("123");
node1.Nodes.Add("123");
node1.Nodes.Add("123");
 
using (var fs = File.Create("test.bin"))
{
    new BinaryFormatter().Serialize(fs, tn);
    fs.Flush();
}
 
using (var fs = File.Open("test.bin", FileMode.Open))
{
    var node = (TreeNode)new BinaryFormatter().Deserialize(fs);
    treeView1.Nodes.Add(node);
}
0
MDmitry_
81 / 49 / 5
Регистрация: 01.10.2010
Сообщений: 464
06.03.2012, 12:28  [ТС] #9
Цитата Сообщение от Konctantin Посмотреть сообщение
ужас, что вы тут наворотили?
вот, как ни странно, но все работает:
Посмотрите внимательнее пост 1. P.P.S.
0
freeba
Неадекват
1173 / 970 / 105
Регистрация: 02.04.2010
Сообщений: 2,239
Записей в блоге: 2
Завершенные тесты: 2
06.03.2012, 14:46 #10

Не по теме:

Konctantin, бЭйсик стайл



Потихоньку начинаем гадать на кофейной гуще. Выкладывайте объект который надо сериализовать, а потом десеариализовать в поток байтов. А мы уж как нибудь по-упражняемся...
0
MDmitry_
81 / 49 / 5
Регистрация: 01.10.2010
Сообщений: 464
06.03.2012, 19:09  [ТС] #11
Объект TreeNode. Дерево строит сам пользователь.
0
Konctantin
924 / 728 / 63
Регистрация: 12.04.2009
Сообщений: 1,700
06.03.2012, 20:32 #12
Посмотрите внимательнее пост 1. P.P.S.
мде... смотрел, и нифига не понял, зачем столько извращения, садомазо++ в моде?
0
MDmitry_
81 / 49 / 5
Регистрация: 01.10.2010
Сообщений: 464
06.03.2012, 21:13  [ТС] #13
Цитата Сообщение от Konctantin Посмотреть сообщение
мде... смотрел, и нифига не понял, зачем столько извращения, садомазо++ в моде?
Хочу записать в базу данных. Файл в базу не запишешь
0
Konctantin
924 / 728 / 63
Регистрация: 12.04.2009
Сообщений: 1,700
07.03.2012, 15:52 #14
ну так с этого и надо было начинать...

Добавлено через 18 часов 34 минуты
вот так как вы писали, и все так же работает, если что-то не так, то пожалуйста подробно все излагайте и показывайте что у вас есть и чего и от куда вы хотите, еще как поизвращаться, я не придумал.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var tn = new TreeNode();
var node1 = tn.Nodes.Add("123");
node1.Nodes.Add("123");
node1.Nodes.Add("123");
node1.Nodes.Add("123");
node1.Nodes.Add("123");
 
using (var fs = File.Create("test.bin"))
{
    new BinaryFormatter().Serialize(fs, tn);
    fs.Flush();
}
 
using (var fs = new BinaryReader(File.Open("test.bin", FileMode.Open)))
{
    // вернемся к тем же баранам и сначала получим массив байт
    byte[] b = fs.ReadBytes((int)fs.BaseStream.Length);
 
    // а потом же и используем его
    var node = (TreeNode)new BinaryFormatter().Deserialize(new MemoryStream(b));
    treeView1.Nodes.Add(node);
}
1
MDmitry_
81 / 49 / 5
Регистрация: 01.10.2010
Сообщений: 464
08.03.2012, 23:48  [ТС] #15
Цитата Сообщение от Konctantin Посмотреть сообщение
еще как поизвращаться, я не придумал.
да уж, изврат ещё тот

ваш код работает.

Приведу тогда полностью функции с базой данных

Добавлено через 59 секунд
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        /// <summary>
        /// Получить объект из БД.
        /// </summary>
        /// <param name="nameAttribute">Имя атрибута</param>
        /// <returns>Поток для десереализации</returns>
        public MemoryStream GetNode(string nameAttribute)
        {
            MySqlCommand mysql_query = new MySqlCommand("", mysql_connection);
            object value = null;
 
            // Считать дерево с БД
            if (OpenConnection())
            {
                // Генерация запроса
                mysql_query.CommandText = "SELECT attribute FROM  attribute_node WHERE Name='" + 
                    nameAttribute + "'";
                // Считывание дерева с БД
                try
                {
                    MySqlDataReader mysql_result = mysql_query.ExecuteReader();
                    if (mysql_result.HasRows == true)
                    {
                        mysql_result.Read();
                        value = mysql_result.GetValue(0);                        
                    }
                    mysql_result.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(errorProgram + ex.Message);
                }
                finally
                {
                    mysql_connection.Close();
                }
            }
 
            // Преобразование извлечённого значения в поток
            byte[] array = (byte[])value;
            MemoryStream streamBytes = new MemoryStream(array);
 
            return streamBytes;
        }
Добавлено через 2 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        /// <summary>
        /// Конструктор (показать содержимое древовидного атрибута)
        /// </summary>
        /// <param name="stream">Поток для десереализации</param>
        public FormAttributeNode(MemoryStream stream)
        {
            InitializeComponent();
 
            // Десериализовать дерево            
            stream.Position = 0;
            TreeNode treeNode = null;
            try
            {
                treeNode = (TreeNode)new BinaryFormatter().Deserialize(stream);
            }
            catch (SerializationException ex)
            {
                MessageBox.Show(errorMessage + "Невозможно десериализовать объект. Объект не помечен, как сериализуемый. "
                    + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(errorMessage + "Невозможно десериализовать объект. " + ex.Message);
            }
            // Вывести загруженное дерево на экран
            if (treeNode != null)
            {
                trvTree.Nodes.Add(treeNode);
                trvTree.ExpandAll();
            }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2012, 23:48
Привет! Вот еще темы с ответами:

Ошибка-конец файла обнаружен ранее, чем левая фигурная скобка '{' - C++/CLI WinForms
В общем вылазит такая ошибка, значит где то не хватает скобки(ок). Не пойму где. Вот код(ниже прикрепил саму прогу): #pragma once ...

YACC/ синтаксический анализатор для грамматического разбора входного потока цифровой информации - C Linux
Проблема состоит в том, что не получается разработать синтаксический анализатор для грамматического разбора входного потока цифровой...

Завершения потока - Программирование Android
Можно как-нить запустить новый поток, только после того как завершится первый???

Ждем завершения потока - C#
Здравствуйте. Помогите разобраться новичку. Пытаюсь объединить аудио с видео и получить сообщения из ffmpeg.exe при выполнении. В конце...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
08.03.2012, 23:48
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru