Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > > >
Восстановить пароль Регистрация

Ответ Создать новую тему
 
MDmitry_
Форумчанин
58 / 26 / 2
Регистрация: 01.10.2010
Сообщений: 295
05.03.2012, 02:01     Десериализация. Конец потока обнаружен до завершения разбора
  #1
При десереализации возникает следующая ошибка: Объект, не помечен, как сериализуемый. Конец потока обнаруен до завершения разбора.

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

Сериализация производится по следующей цепочке: объект - сериализация (в 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);
Но нужно использовать массив байтов, см. выше почему
AdAgent
Объявления
05.03.2012, 02:01
freeba
Модератор
850 / 700 / 36
Регистрация: 02.04.2010
Сообщений: 1,688
Записей в блоге: 2
05.03.2012, 13:23
  #2
Так и не нашел объявления deserializer. Весь код в студию - куски как-то не представляют всей картины.
m0nax
Форумчанин
911 / 684 / 30
Регистрация: 12.01.2010
Сообщений: 1,435
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);
и все заработает
MDmitry_
Форумчанин
58 / 26 / 2
Регистрация: 01.10.2010
Сообщений: 295
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(); 
freeba
Модератор
850 / 700 / 36
Регистрация: 02.04.2010
Сообщений: 1,688
Записей в блоге: 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'у не нравятся какие либо байты.
MDmitry_
Форумчанин
58 / 26 / 2
Регистрация: 01.10.2010
Сообщений: 295
05.03.2012, 22:52  [ТС]
  #6
нет, не помогло, а { } для чего?
freeba
Модератор
850 / 700 / 36
Регистрация: 02.04.2010
Сообщений: 1,688
Записей в блоге: 2
05.03.2012, 23:49
  #7
привычка )))

Очень странно. Попробуйте тогда сериализовать в Stream, а не только извелкать им.
Konctantin
Форумчанин
768 / 572 / 24
Регистрация: 12.04.2009
Сообщений: 1,437
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);
}
MDmitry_
Форумчанин
58 / 26 / 2
Регистрация: 01.10.2010
Сообщений: 295
06.03.2012, 12:28  [ТС]
  #9
Цитата Сообщение от Konctantin Посмотреть сообщение
ужас, что вы тут наворотили?
вот, как ни странно, но все работает:
Посмотрите внимательнее пост 1. P.P.S.
freeba
Модератор
850 / 700 / 36
Регистрация: 02.04.2010
Сообщений: 1,688
Записей в блоге: 2
06.03.2012, 14:46
  #10

Не по теме:

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



Потихоньку начинаем гадать на кофейной гуще. Выкладывайте объект который надо сериализовать, а потом десеариализовать в поток байтов. А мы уж как нибудь по-упражняемся...
MDmitry_
Форумчанин
58 / 26 / 2
Регистрация: 01.10.2010
Сообщений: 295
06.03.2012, 19:09  [ТС]
  #11
Объект TreeNode. Дерево строит сам пользователь.
Konctantin
Форумчанин
768 / 572 / 24
Регистрация: 12.04.2009
Сообщений: 1,437
06.03.2012, 20:32
  #12
Посмотрите внимательнее пост 1. P.P.S.
мде... смотрел, и нифига не понял, зачем столько извращения, садомазо++ в моде?
MDmitry_
Форумчанин
58 / 26 / 2
Регистрация: 01.10.2010
Сообщений: 295
06.03.2012, 21:13  [ТС]
  #13
Цитата Сообщение от Konctantin Посмотреть сообщение
мде... смотрел, и нифига не понял, зачем столько извращения, садомазо++ в моде?
Хочу записать в базу данных. Файл в базу не запишешь
Konctantin
Форумчанин
768 / 572 / 24
Регистрация: 12.04.2009
Сообщений: 1,437
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);
}
MDmitry_
Форумчанин
58 / 26 / 2
Регистрация: 01.10.2010
Сообщений: 295
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();
            }
Yandex
Объявления
08.03.2012, 23:48
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
Photoshop Загрузка операций не возможна: Обнаружен неожиданный конец файла
Появился такой баг в фотошопе: при попытке открыть его, вначале вылазит окно "Загрузка операций не возможна: Обнаружен неожиданный конец файла.", потом за ним "Инициализация программ Photoshop...
Photoshop smit1987 12.07.2014 16:14
C# Не работает десериализация класса. Исключение: "обнаружен конец потока до завершения разбора"
Добрый день, C#-разработчики:) Имеется следующий класс public class RedBlack : object { private int intCount; private static RedBlackNode rbTree; ...
C# для начинающих GoVegan 16.06.2014 18:28
C# WinForms Ждать завершения потока (без зависания формы)
Здравствуйте товарищи! Столкнулся с такой вот проблемой. Пишу программу, которая запускает через cmd.exe некие команды. Форма зависает на прослушивании ответа от cmd (Оно и понятно, там цикл...
C# Windows Forms 6eH 04.06.2014 09:22
Android Завершения потока
Можно как-нить запустить новый поток, только после того как завершится первый???
Программирование Android Stylish2013 27.05.2013 00:48
C++ Builder Ожидание завершения потока
Доброго вечера. Подскажите...то я что то сам не разобрался... Как подождать завершения потока... // if (поток завершен) { OSCAM1Click(0); // жмяк } // else (ждем завершения...
C++ Builder Ddv122 20.02.2013 03:01
C# WinForms Ожидание завершения потока
private void button1_Click(object sender, EventArgs e) { System.Threading.Thread MyThread1 = new System.Threading.Thread(delegate() { MyMetod("jhgf", "hg");...
C# Windows Forms Sendello 10.09.2012 15:38
C# Исключение при дессериализации "обнаружен конец потока до завершения разбора"
Здравствуйте, уважаемые,подскажите пожалуйста из-за чего выскакивает исклюение "обнаружен конец потока до завершения разбора" в строке дессериализации. public Object Receive(Int64 buf) { ...
C# .NET 6salo6 06.02.2012 00:43
C# Нет полного завершения потока
Возникла проблема, в одном из потоков на первой форме запускается функция, которая открывает и закрывает DVD привод раз в 3 секунды: private void Process2() { while (true) ...
C# для начинающих MaximusSM 10.06.2011 15:31
Опции темы

Текущее время: 11:03. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.