Десериализация генерирует исключение для этого бита кода 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 (это один класс и один модульный тест). Модульный тест выдает исключение сбой сбой сбой. Пожалуйста, проверьте это.

Другие вопросы по тегам