Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/27: Рейтинг темы: голосов - 27, средняя оценка - 4.78
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696

Ошибка сериализации

14.01.2011, 04:32. Показов 4989. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Приложение выбрасывает исключение и я не могу понять почему:
Двоичный поток "0" не содержит допустимого двоичного заголовка BinaryHeader. Возможные причины: недопустимый поток или изменение версии объекта между сериализацией и десериализацией.
В месте:
C#
1
2
                lock (sLock)
                { bmp = (Bitmap)bf.Deserialize(ms); }
Что с этим делать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.01.2011, 04:32
Ответы с готовыми решениями:

Ошибка сериализации
есть класс, в котором 2 массива List<string>, есть listView, я добавляю в него эл-ты и одновременно добавляют элементы в массив того...

Ошибка при сериализации
При компиляции вылетает такая ошибка: Cannot create and instance of the abstract class or interface "System.Xml.XmlWriter". ...

Ошибка сериализации/десериализации
Доброго времени суток. Пишу программу для передачи информации о компьютере по сети. Имеются 2 приложения (сейчас обы Windows Form, в...

8
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
14.01.2011, 11:27
использование BinaryFormatter для чтения/записи картинок - уже полнейшее извращение: даже в проблему вникать не надо, просто - это плохо. У картинок есть 2 метода Save/Load - используй их

зы. а еще лучше вообще не используй BinaryFormatter в будущем - он нужен только для очень грубых дампов узких мест, когда ну совсем не хочется опытному(!) программисту тратить время на аккуратный слив отладочной информации/трассировки для того, чтобы подправить это потом (например, хочет спать), а ошибки могут быть и критическими.
ззы. если совсем невмоготу - см. класс BinaryWriter - и пиши ручками всё, что надо

Добавлено через 7 минут
Цитата Сообщение от body90 Посмотреть сообщение
изменение версии объекта между сериализацией и десериализацией.
даже маленькое изменение класса (также как и версии, ключа и имени сборки), для которого работает сериализация/десереализация, приводит к невозможности считывания дампа
2
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
14.01.2011, 11:39
Тут есть пример сохранения изображения в поток и загрузки из него:
Общение с камерой на C#
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
14.01.2011, 12:37  [ТС]
Mikant, Я принимаю это изображение по сети. На одной стороне сериализирую, на другой обратно. Как с помощью Save/Load я могу передать изображение по сети?
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
14.01.2011, 13:36
Сохраняем изображение в массив byte, передаём его и создаём изображение обратно.
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
44
45
46
47
48
49
50
51
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplicationTest2 {
    public partial class MainForm : Form {
        private byte[] bytes;
 
        public MainForm() {
            InitializeComponent();
        }
 
        private void buttonOpen_Click( object sender, EventArgs e ) {
            if ( bytes != null && bytes.Length > 0 ) {
                Bitmap bitmap;
 
                // Создаём поток из массива
                using ( MemoryStream stream = new MemoryStream( bytes ) ) {
                    // Загружаем картинку из потока
                    bitmap = new Bitmap( stream );
                }
                pictureBox1.Image = bitmap;
            }
        }
 
        private void buttonSave_Click( object sender, EventArgs e ) {
            // Получаем изображение
            Bitmap bitmap = new Bitmap( "test.jpg" );
 
            // Настройки кодировщика
            ImageCodecInfo jgpEncoder = ImageCodecInfo
                .GetImageDecoders()
                .First( codec => codec.FormatID == ImageFormat.Jpeg.Guid );
            EncoderParameters myEncoderParameters = new EncoderParameters();
 
            // Уровень сжатия
            myEncoderParameters.Param[ 0 ] = new EncoderParameter( Encoder.Quality, 33L );
 
            // Сохраняем изображение в поток
            using ( MemoryStream stream = new MemoryStream() ) {
                bitmap.Save( stream, jgpEncoder, myEncoderParameters );
 
                // Сохраняем поток в массив
                bytes = stream.ToArray();
            }
        }
    }
}
2
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
14.01.2011, 16:34  [ТС]
Цитата Сообщение от Unril Посмотреть сообщение
Тут есть пример сохранения изображения в поток и загрузки из него:
Общение с камерой на C#
Та в этом топике я и писал все примеры, кроме вашего. Там всё делалось в одном приложении. А я и не знал, что если сериализировать данные в одном приложении - в другом их нельзя десериализировать.

Добавлено через 4 минуты
Цитата Сообщение от Mikant Посмотреть сообщение
использование BinaryFormatter для чтения/записи картинок - уже полнейшее извращение: даже в проблему вникать не надо, просто - это плохо. У картинок есть 2 метода Save/Load - используй их
зы. а еще лучше вообще не используй BinaryFormatter в будущем - он нужен только для очень грубых дампов узких мест, когда ну совсем не хочется опытному(!) программисту тратить время на аккуратный слив отладочной информации/трассировки для того, чтобы подправить это потом (например, хочет спать), а ошибки могут быть и критическими.
ззы. если совсем невмоготу - см. класс BinaryWriter - и пиши ручками всё, что надо
Ладно, с изображением протупил. Но а как быть без сериализации для собственноручно написанных классов? Сохранять каждое поле отдельно? А если класс очень большой и не один? Тем более поля могут быть непростыми типами данных.
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
14.01.2011, 17:22
Попробуй сериализовать с помощью DataContract. К примеру:
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
44
45
46
47
48
49
50
51
using System;
using System.Drawing;
using System.Runtime.Serialization;
using System.Windows.Forms;
using System.Xml;
 
namespace WindowsFormsApplicationTest2 {
    public partial class MainForm : Form {
        public MainForm() {
            InitializeComponent();
        }
 
        private void buttonOpen_Click( object sender, EventArgs e ) {
            // Десериализуем
            DataContractSerializer serializer = new DataContractSerializer( typeof ( MyClass ) );
            MyClass myClass;
            using ( XmlReader writer = XmlReader.Create( "test.xml" ) ) {
                myClass = (MyClass)serializer.ReadObject( writer );
            }
 
            // Считываем данные из полученного экземпляра
            pictureBox1.Image = myClass.MyBitmap;
            Text = myClass.Name;
        }
 
        private void buttonSave_Click( object sender, EventArgs e ) {
            // Создаём экземпляр класса
            Bitmap bitmap = new Bitmap( "test.jpg" );
            MyClass myClass = new MyClass {
                MyBitmap = bitmap,
                Name = "Bitmap1"
            };
 
            // Сериализуем
            DataContractSerializer serializer = new DataContractSerializer( typeof ( MyClass ) );
            using ( XmlWriter writer = XmlWriter.Create( "test.xml" ) ) {
                serializer.WriteObject( writer, myClass );
            }
        }
    }
 
    [Serializable]
    [DataContract]
    public class MyClass {
        [DataMember]
        public Bitmap MyBitmap { get; set; }
 
        [DataMember]
        public string Name { get; set; }
    }
}
System.Runtime.Serialization
DataContractSerializer
С помощью XmlDictionaryWriter и XmlDictionaryReader можно записывать xml в различных форматах.
1
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
14.01.2011, 22:43
Цитата Сообщение от body90 Посмотреть сообщение
Сохранять каждое поле отдельно?
да, да и еще раз да! я не поверю, что у тебя есть классы такого размера, на ручную сериализацию которых может потребоваться больше 10 минут! надо только понять, что далеко не каждое поле класса отвечает его свойствам и текущим параметрам (плохо объяснил? свойство Connected у Socket сериализовать не надо=) )
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
15.01.2011, 03:28  [ТС]
Unril, Если уж сериализация, то какие плюсы у DataContract перед BinaryFormatter?

Добавлено через 3 минуты
Mikant, пасибо, понял. Но иногда не очень хочется (полностью согласен, что это отрицательная черта) изобретать велосипед для рядовой програмки, которая дальше моего компьютера не уйдет) В нормальных проектах так и делал: сохранял всё сам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2011, 03:28
Помогаю со студенческими работами здесь

Ошибка при сериализации
случилось у меня такая ситуация, что есть у меня класс, который я успешно сериализовал, после изменений в проекте (без изменений этого...

Ошибка при сериализации от клиента серверу
Передаём данные между сервером и клиентом, при первой сериализации от клиента к серверу - всё гладко, а обратно выбивает ошибку! Самое...

Ошибка при сериализации класса AL7_Class_ExtFileInfo
Здравствуйте. Есть 2 класса. using System; using System.IO; namespace DH_Launcher { public class...

Ошибка InvalidOperationException при Xml сериализации
Здравствуйте! У меня возникла проблема при xml сериализации. Суть проблемы такова, я хочу сохранить список List<myReference> в...

Возникла ошибка при отражении типа во время XML сериализации
В строке using (Stream Read = File.Create(FileName)) { FilialList = new...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru