反序列化会引发此C#代码的异常

时间:2008-11-26 12:27:46

标签: c# exception serialization memorystream

编辑:关闭这个因为我找到了它错误的原因,但不是删除这篇文章..我生成一个更精确的问题的新帖子。


嗨大家好,

我已经阅读了一些二进制数据。我希望将其转换为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);     
}

这是尝试反序列化图像的代码,它抛出异常(this is a seperate image of the exception

alt text http://img254.imageshack.us/img254/9748/step1zx3wk5.png

是否存在未正确处理掉或无法序列化的内容..因此抛出异常?

请帮助:)


编辑:在我的 Image Debugger Visualizer 中调用异常。

我上传了完整的VS2008解决方案here(1.28MB下载)。

这是两个项目 - > 可视化工具类 MS测试类。如果你运行唯一的单元测试,它将抛出通用(读取:无用)GDI +异常,因为它无法反序列化通过线路传递给调试器的Image实例。如果您传递了一个使用文件路径构造函数创建的Image实例,则反序列化可以完美地运行。

编辑2:使用了不同的文件上传网站 - 干杯!

编辑3:如何实际重现错误。

  • 将项目更改为DEBUG模式(非发布模式)
  • 删除所有断点。
  • 打开ImageDebuggerVisualizer.cs
  • 在第22行添加断点。
  • 现在调试 UnitTest1单元测试方法。图像将显示..关闭该窗口..然后突然你将在断点处。跨过那个和BOOM !!!! CRASH! BANG。

编辑4:这是异常的两个SCREEN SHOTS(如果你不想下载解决方案文件)。

3 个答案:

答案 0 :(得分:3)

我怀疑在您的真实代码中,您正在写入MemoryStream而不是将其倒回;如果是这种情况,请在尝试重新加载之前将Position设置为0.

答案 1 :(得分:2)

刚刚测试了你的代码,它运行良好,代码很好。图像文件或路径一定存在问题。 这是我的考验:

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中看到了图像。

答案 2 :(得分:0)

我更新了初始问题帖子,其中包含整个VS解决方案的链接(这是一个班级和一个单元测试)。单元测试会抛出失败失败失败异常。请检查一下。