Десериализация генерирует исключение для этого бита кода C#
Изменить: Закрытие, потому что я нашел причину, по которой он ошибается, но вместо того, чтобы удалить этот пост... я создаю более новый пост с более уточненным вопросом.
Привет народ,
У меня есть некоторые двоичные данные, которые я прочитал. Я хочу преобразовать их в System.Drawing.Image
так что я создаю экземпляр Image object
, используя memory stream
в качестве входных данных.
После этого я сериализую, а затем десериализую изображение (для некоторой бизнес-логики). Десериализация создает исключение. Если я создам Image
экземпляр с конструктором имени файла вместо конструктора потока памяти, все работает на 100%. Это говорит о том, что Image
объект может быть сериализован по проводу.
Что я делаю не так с memory stream
Я использовал?
это код, который я использую для создания объекта Image, прежде чем он будет сериализован:
// Fake way of getting some binary (image) data.
byte[] data = File.ReadAllBytes("Chick.jpg");
using (Stream originalBinaryDataStream = new MemoryStream(data))
{
// This works perfectly fine, if use this method (which i can't).
//image = new Bitmap("Chick.jpg");
// This throws an exception when it's deserialized.
// It doesn't like the memory stream reference?
image = new Bitmap(originalBinaryDataStream);
}
это код, который пытается десериализовать изображение, которое выдает исключение ( это отдельное изображение исключения)
http://img254.imageshack.us/img254/9748/step1zx3wk5.png
Есть ли что-то, что неправильно удалено ИЛИ не может быть сериализовано.. следовательно, выдает исключение?
Пожалуйста помоги:)
РЕДАКТИРОВАТЬ: Исключение вызывается в моем Image Debugger Visualizer.
Я загрузил полное решение VS2008 здесь (загрузка 1.28MB).
В нем два проекта -> класс визуализатора и класс MS Test. Если вы запустите единственный модульный тест, он сгенерирует универсальное (читай: бесполезное) исключение GDI+, так как не сможет десериализовать экземпляр Image, который был передан по проводам, а именно отладчику. Если вы передали ему экземпляр Image, созданный с помощью конструктора пути к файлу, десериализация работает отлично.
РЕДАКТИРОВАТЬ 2: использовать другой файл загрузки сайта - ура!
РЕДАКТИРОВАТЬ 3: Как на самом деле воспроизвести ошибку.
- Переключить проект в режим DEBUG (не в режиме релиза)
- Удалить все точки разрыва.
- Откройте ImageDebuggerVisualizer.cs
- Добавьте точку останова в строку 22.
- Теперь отладьте метод юнит-теста UnitTest1. Изображение покажет... закройте это окно... и вдруг вы окажетесь на точке разрыва. перешагни через это и БУМ!!!! CRASH!! BANG.
РЕДАКТИРОВАТЬ 4: Вот два снимка экрана исключения (если вы не хотите загружать файл решения).
- Прежде чем я перейду через оскорбительную линию
- После того, как я перешагнул через оскорбительную линию, где выдается исключение.
3 ответа
Я подозреваю, что в вашем реальном коде вы пишете MemoryStream
и не перематывать его; если это так, установите Position в 0, прежде чем пытаться перезагрузить его.
Только что проверил ваш код, он работал, код в порядке. Должна быть проблема с файлом изображения или путем. Это мой тест:
private void Form1_Load(object sender, EventArgs e)
{
byte[] data = File.ReadAllBytes("c:\\t.jpg");
using (Stream originalBinaryDataStream = new MemoryStream(data))
{
// This works perfectly fine, if use this method (which i can't).
//image = new Bitmap("Chick.jpg");
// This throws an exception when it's deserialized.
// It doesn't like the memory stream reference?
originalBinaryDataStream.Seek(0, SeekOrigin.End);
pictureBox1.Image= new Bitmap(originalBinaryDataStream);
}
}
И я вижу изображение в PictureBox.
Я обновил первоначальный пост вопроса со ссылкой на все решение VS (это один класс и один модульный тест). Модульный тест выдает исключение сбой сбой сбой. Пожалуйста, проверьте это.