反序列化会引发这段 C# 代码的异常 [已关闭]

问题描述 投票:0回答:3

我读入了一些二进制数据。我希望将其转换为

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);     
}

这是尝试反序列化图像的代码,它会抛出异常(这是异常的单独图像

alt text

是否有某些内容未正确处理或无法序列化,从而引发异常?

编辑

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

我已经上传了完整的 VS2008 解决方案这里(1.28MB 下载)。

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

编辑2:使用了不同的文件上传网站。

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

  • 将项目更改为DEBUG模式(不是发布模式)
  • 删除所有断点。
  • 打开ImageDebuggerVisualizer.cs
  • 在第 22 行添加断点。
  • 现在调试UnitTest1单元测试方法。图像将显示..关闭该窗口..然后突然您将处于断点。跨过它就会崩溃。

编辑 4:这是异常的两个屏幕截图(如果您不想下载解决方案文件)。

编辑5

关闭此内容是因为我已经找到了错误的原因,但我没有删除这篇文章,而是生成了一篇包含更精致问题的新文章。

c# exception serialization memorystream
3个回答
3
投票

我怀疑在你的真实代码中你正在写入

MemoryStream
而不是倒回它;如果是这种情况,请在尝试重新加载之前将 Position 设置为 0。


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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.