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

Ответ Создать новую тему
 
05.03.2012, 02:01   #1
MDmitry_
Форумчанин
Регистрация: 01.10.2010
Сообщений: 293
Репутация: 57 (25)
Лучшие ответы: 2
Десериализация. Конец потока обнаружен до завершения разбора / C# .NET

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

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

Сериализация производится по следующей цепочке: объект - сериализация (в 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);
Но нужно использовать массив байтов, см. выше почему
05.03.2012, 02:01
AdAgent
Объявления
05.03.2012, 13:23   #2
freeba
Модератор
Регистрация: 02.04.2010
Сообщений: 1,672
Репутация: 840 (690)
Записей в блоге: 2
Лучшие ответы: 33
Десериализация. Конец потока обнаружен до завершения разбора

Так и не нашел объявления deserializer. Весь код в студию - куски как-то не представляют всей картины.
Другие темы раздела
C# Динамическое создание компонентов и подписка их на события
Добрый день! Я начинающий программист, пытаюсь разобраться с созданием массивов control-ов и ихних событий. У меня есть три tableLayoutPanel, я в цыкле поместил в каждую ячейку лейблы и создал для них события MouseEnter и MouseLeave. Программа запускается и работает, но при наведении курсора на...
C# Как обработать папку с доступом через Интернет
необходимо обработать директорию, расшаренную в интернете по какому-то адресу типа http://1/2/ а именно получить количество файлов в каталогах их название и т д какой класс для этого можно использовать? Добавлено через 4 часа 3 минуты решила через парсер html страницы, т к время поджимало,...
05.03.2012, 14:12   #3
m0nax
Форумчанин
Регистрация: 12.01.2010
Сообщений: 1,414
Репутация: 897 (670)
Лучшие ответы: 29
Десериализация. Конец потока обнаружен до завершения разбора

Код C#
1
2
MemoryStream stream2 = new MemoryStream();
stream2.Write(array2, 0, array2.Length);
замени на
Код C#
1
MemoryStream stream2 = new MemoryStream(array2);
и все заработает
05.03.2012, 16:45  [ТС]   #4
MDmitry_
Форумчанин
Регистрация: 01.10.2010
Сообщений: 293
Репутация: 57 (25)
Лучшие ответы: 2
Десериализация. Конец потока обнаружен до завершения разбора

Цитата Сообщение от 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(); 
05.03.2012, 16:45
AdAgent
Объявления
05.03.2012, 20:19   #5
freeba
Модератор
Регистрация: 02.04.2010
Сообщений: 1,672
Репутация: 840 (690)
Записей в блоге: 2
Лучшие ответы: 33
Десериализация. Конец потока обнаружен до завершения разбора

Попробуйте так:
Код 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'у не нравятся какие либо байты.
05.03.2012, 22:52  [ТС]   #6
MDmitry_
Форумчанин
Регистрация: 01.10.2010
Сообщений: 293
Репутация: 57 (25)
Лучшие ответы: 2
Десериализация. Конец потока обнаружен до завершения разбора

нет, не помогло, а { } для чего?
05.03.2012, 23:49   #7
freeba
Модератор
Регистрация: 02.04.2010
Сообщений: 1,672
Репутация: 840 (690)
Записей в блоге: 2
Лучшие ответы: 33
Десериализация. Конец потока обнаружен до завершения разбора

привычка )))

Очень странно. Попробуйте тогда сериализовать в Stream, а не только извелкать им.
06.03.2012, 10:08   #8
Konctantin
Форумчанин
Регистрация: 12.04.2009
Сообщений: 1,420
Репутация: 762 (566)
Лучшие ответы: 23
Десериализация. Конец потока обнаружен до завершения разбора

ужас, что вы тут наворотили?
вот, как ни странно, но все работает:
Код 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);
}
06.03.2012, 12:28  [ТС]   #9
MDmitry_
Форумчанин
Регистрация: 01.10.2010
Сообщений: 293
Репутация: 57 (25)
Лучшие ответы: 2
Десериализация. Конец потока обнаружен до завершения разбора

Цитата Сообщение от Konctantin Посмотреть сообщение
ужас, что вы тут наворотили?
вот, как ни странно, но все работает:
Посмотрите внимательнее пост 1. P.P.S.
06.03.2012, 14:46   #10
freeba
Модератор
Регистрация: 02.04.2010
Сообщений: 1,672
Репутация: 840 (690)
Записей в блоге: 2
Лучшие ответы: 33
Десериализация. Конец потока обнаружен до завершения разбора / C# .NET

Не по теме:

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



Потихоньку начинаем гадать на кофейной гуще. Выкладывайте объект который надо сериализовать, а потом десеариализовать в поток байтов. А мы уж как нибудь по-упражняемся...
06.03.2012, 14:46
Yandex
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
C#: Не работает десериализация класса. Исключение: "обнаружен конец потока до завершения разбора"
Добрый день, C#-разработчики:) Имеется следующий класс public class RedBlack : object { private int intCount; private static RedBlackNode rbTree; public RedBlackNode sentinelNode; private RedBlackNode lastNodeFound; ...
C# для начинающих GoVegan 16.06.2014 18:28
Android: Завершения потока
Можно как-нить запустить новый поток, только после того как завершится первый???
Программирование Android Stylish2013 27.05.2013 00:48
C# WinForms: Ожидание завершения потока
private void button1_Click(object sender, EventArgs e) { System.Threading.Thread MyThread1 = new System.Threading.Thread(delegate() { MyMetod("jhgf", "hg"); }); MyThread1.Start(); //ожидание завершения потока и только потом идем...
C# Windows Forms Sendello 10.09.2012 15:38
Python: Ожидание завершения потока
Всем привет. В цикле создаю и запускаю N потоков. Интересует как сделать чтобы главный поток ожидал завершения всех этих потоков, после чего продолжил работу? Все потоки могут работать по разному. Пример: от 1 до 10 создать и запустить поток продолжить работу после завершения работы...
Python John_Pa9JIbHuK 22.03.2012 20:39
C#: Исключение при дессериализации "обнаружен конец потока до завершения разбора"
Здравствуйте, уважаемые,подскажите пожалуйста из-за чего выскакивает исклюение "обнаружен конец потока до завершения разбора" в строке дессериализации. public Object Receive(Int64 buf) { BinaryFormatter bFormat = new BinaryFormatter(); MemoryStream mStream = new...
C# .NET 6salo6 06.02.2012 00:43
Опции темы

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

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