【问题标题】:Deserialization throws an exception for this bit of C# code [closed]反序列化会为这段 C# 代码引发异常 [关闭]
【发布时间】:2008-11-26 12:27:45
【问题描述】:

编辑:关闭这个是因为我找到了它出错的原因,但是我没有删除这个帖子..我生成了一个更新的帖子,里面有一个更精致的问题。


大家好,

我有一些我读入的二进制数据。我希望将其转换为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 下载)。

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

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

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

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

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

【问题讨论】:

  • 我们需要代码的整个上下文和抛出的异常。
  • 多么糟糕的分享网站!未来使用提示drop.io
  • 点头凯斯!我已将其更改为您的建议。干杯!

标签: c# exception serialization memorystream


【解决方案1】:

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

【讨论】:

  • 他不写内存流,他用字节数组初始化。无需重新定位。
  • @Ovidiu - 因此我提到了“真实代码”....
  • 我在内存流上添加了一个寻求结束,它仍然有效,请参阅我的答案。
  • 我们需要代码的整个上下文和抛出的异常。
  • 我已将整个异常信息添加到屏幕截图中(因为这是一个巨大的异常)到开头的帖子。
【解决方案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 中看到了图像。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 也没有复制,单元测试工作正常。您必须发布异常的堆栈跟踪。至少小鸡是值得的。
    • 嗯。我只是 dl'd 解决方案并 repo'd 异常。我已经在原始帖子中添加了回购它的步骤。请查看它是如何回购的。 pwease?
    • 您应该按照前面的建议发布抛出的异常。
    • 在原始帖子中添加了显示异常的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多