2008-11-26 86 views
2

编辑:关闭这个,因为我发现它的原因为错误,但不是删除这个帖子..我生成一个更新的帖子,更精确的问题。反序列化抛出这个位的C#代码异常


嗨伙计,

我有一些二进制数据我在读我的心愿。将其转换为一个System.Drawing.Image,所以我创建Image object的实例,使用memory stream作为输入数据。

我这样做后,我序列化然后反序列化图像(对于一些业务逻辑)。反序列化引发异常。如果我使用文件名构造函数而不是内存流构造函数创建Image实例,它将全部工作100%。这表明Image对象可以通过电线串行化。

我做错了memory stream,我用过了吗?

这是我使用使图像对象的代码,它被序列之前: -

// 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

有没有正确处理或不能序列化..因此抛出异常?

请帮助:)


编辑:唯一的例外是在叫我图像调试器可视

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

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

编辑2:使用不同的文件上传网站 - 欢呼!

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

  • 更改项目,在调试模式(而不是释放模式)
  • 删除所有破发点。
  • 打开ImageDebuggerVisualizer.cs
  • 添加断点到管线22
  • 现在调试的UnitTest1单元测试方法。图像将显示..关闭该窗口..然后突然你将在折点上。一步一步和繁荣! CRASH!砰。

编辑4:这里有两个SCREEN SHOTS的例外(如果你不想下载解决方案文件)。

+0

你会得到什么例外? – 2008-11-26 12:36:08

+0

我们需要整个代码的上下文和引发的异常。 – 2008-11-26 12:56:23

+0

提供的解决方案链接:) – 2008-11-26 13:10:42

回答

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

而且我看到在图片框的图像。

3

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

0

我已经更新了一个链接整个VS解决方案(这是一个类和一个单元测试)的初始问题。单元测试会引发失败失败失败异常。请检查一下。