Форум программистов и сисадминов CyberForum.ru
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум Форум программистов > Форум .NET > Форум C# .NET
Восстановить пароль Регистрация

Ответ Создать новую тему
 
Старый 05.03.2012, 02:01   #1
MDmitry_
Форумчанин
 
Регистрация: 01.10.2010
Сообщений: 284
Репутация: 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, 13:23   #2
freeba
Модератор
 
Аватар для freeba
 
Регистрация: 02.04.2010
Сообщений: 1,582
Репутация: 795 (645)
Записей в блоге: 2
Лучшие ответы: 25
Десериализация. Конец потока обнаружен до завершения разбора

Так и не нашел объявления deserializer. Весь код в студию - куски как-то не представляют всей картины.
Другие темы раздела Форум программистов C#. Вопросы использования языка программирования C# .NET. Помощь в решении задач.
C# Динамическое создание компонентов и подписка их на события
Добрый день! Я начинающий программист, пытаюсь разобраться с созданием массивов control-ов и ихних событий. У меня есть три tableLayoutPanel, я в цыкле поместил в каждую ячейку лейблы и создал для них события MouseEnter и MouseLeave. Программа запускается и работает, но при наведении курсора на...
C# Как обработать папку с доступом через Интернет
необходимо обработать директорию, расшаренную в интернете по какому-то адресу типа http://1/2/ а именно получить количество файлов в каталогах их название и т д какой класс для этого можно использовать? Добавлено через 4 часа 3 минуты решила через парсер html страницы, т к время поджимало,...
Старый 05.03.2012, 14:12   #3
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 12.01.2010
Сообщений: 1,398
Репутация: 890 (663)
Лучшие ответы: 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
Сообщений: 284
Репутация: 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
Google
Объявления
Старый 05.03.2012, 20:19   #5
freeba
Модератор
 
Аватар для freeba
 
Регистрация: 02.04.2010
Сообщений: 1,582
Репутация: 795 (645)
Записей в блоге: 2
Лучшие ответы: 25
Десериализация. Конец потока обнаружен до завершения разбора

Попробуйте так:
Код 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
Сообщений: 284
Репутация: 57 (25)
Лучшие ответы: 2
Десериализация. Конец потока обнаружен до завершения разбора

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

привычка )))

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

ужас, что вы тут наворотили?
вот, как ни странно, но все работает:
Код 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
Сообщений: 284
Репутация: 57 (25)
Лучшие ответы: 2
Десериализация. Конец потока обнаружен до завершения разбора

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

Не по теме:

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



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

Похожие темы
Тема Автор
С++ для начинающих Как дождаться завершения потока?
void Thread(void* pParam); void main(){ _beginthread(Thread, 0, NULL);//Запускаем поток, он выполняет свои задачи.... //Тут программа выполняет свои задачи... ... //Тут надо дождаться завершения потока, после этого выполнить ещё несколько команд. WaitForSingleObject(Thread, INFINITE); ......
MaxxximyM
Python Ожидание завершения потока
Всем привет. В цикле создаю и запускаю N потоков. Интересует как сделать чтобы главный поток ожидал завершения всех этих потоков, после чего продолжил работу? Все потоки могут работать по разному. Пример: от 1 до 10 создать и запустить поток продолжить работу после завершения работы...
John_Pa9JIbHuK
C# для начинающих Основной поток не дожидается завершения работы вторичного потока
Здравствуйте! Возник такой вопрос. Почему в следующем коде основной поток не дожидается завершения работы вторичного потока. class Program { static AutoResetEvent waitHandle; static void Main(string args) {
NJohn
C# .NET Исключение при дессериализации "обнаружен конец потока до завершения разбора"
Здравствуйте, уважаемые,подскажите пожалуйста из-за чего выскакивает исклюение "обнаружен конец потока до завершения разбора" в строке дессериализации. public Object Receive(Int64 buf) { BinaryFormatter bFormat = new BinaryFormatter(); MemoryStream mStream = new...
6salo6
C# для начинающих Нет полного завершения потока
Возникла проблема, в одном из потоков на первой форме запускается функция, которая открывает и закрывает DVD привод раз в 3 секунды: private void Process2() { while (true) { mciSendString("open G: type CDAudio alias driveG", null, 0,...
MaximusSM
Опции темы

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

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