BinaryFormatter.Serialize(Image) - ExternalException - GDI+中

本文关键字:ExternalException GDI+ Serialize Image BinaryFormatter | 更新日期: 2023-09-27 18:08:27

当我尝试使用BinaryFormatter序列化一些图像时,我会得到一个外部异常- GDI+中发生的通用错误。在绞尽脑汁一段时间后,我决定创建一个简单的测试项目来缩小问题范围:

    static void Main(string[] args)
    {
        string file = @"C:'temp'delme.jpg";
        //Image i = new Bitmap(file);
        //using(FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
        byte[] data = File.ReadAllBytes(file);
        using(MemoryStream originalms = new MemoryStream(data))
        {
            using (Image i = Image.FromStream(originalms))
            {
                BinaryFormatter bf = new BinaryFormatter();
                using (MemoryStream ms = new MemoryStream())
                {
                    // Throws ExternalException on Windows 7, not Windows XP
                    bf.Serialize(ms, i);
                }
            }
        }
    }

对于特定的图片,我尝试了各种加载图片的方法,但我无法让它在Windows 7下工作,即使以管理员身份运行该程序。

我已经将完全相同的可执行文件和映像复制到我的Windows XP VMWare实例中,并且没有问题。

有人知道为什么有些图像在Windows 7下不能工作,但在XP下可以工作吗?


这是其中一张图片:http://www.2shared.com/file/7wAXL88i/SO_testimage.html

BinaryFormatter.Serialize(Image) - ExternalException - GDI+中

delme.jpg md5: 3d7e832db108de35400edc28142a8281

正如OP所指出的,所提供的代码抛出了一个异常,该异常似乎只发生在他提供的图像上,但在我的机器上对其他图像工作良好。

选项1

static void Main(string[] args)
{
    string file = @"C:'Users'Public'Pictures'delme.jpg";
    byte[] data = File.ReadAllBytes(file);
    using (MemoryStream originalms = new MemoryStream(data))
    {
        using (Image i = Image.FromStream(originalms))
        {
            BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                // Throws ExternalException on Windows 7, not Windows XP                        
                //bf.Serialize(ms, i);
                i.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); // Works
                i.Save(ms, System.Drawing.Imaging.ImageFormat.Png); // Works
                i.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); // Fails
            }    
         }
     }
}

可能是有问题的图像是用一个工具创建的,该工具添加了一些干扰JPEG序列化的额外信息。

注:图像可以使用BMPPNG格式保存到内存流中。如果可以选择更改格式,那么您可以尝试这些或ImageFormat中定义的任何其他格式。

选项2 如果您的目标只是将图像文件的内容放入内存流中,那么只需执行以下操作就会有所帮助

static void Main(string[] args)
{
    string file = @"C:'Users'Public'Pictures'delme.jpg";
    using (FileStream fileStream = File.OpenRead(file))
    {
        MemoryStream memStream = new MemoryStream();
        memStream.SetLength(fileStream.Length);
        fileStream.Read(memStream.GetBuffer(), 0, (int)fileStream.Length);
    }
}

虽然Bitmap类被标记为[Serializable],但它实际上并不支持序列化。您能做的最好的事情是序列化包含原始图像数据的byte[],然后使用MemoryStreamImage.FromStream()方法重新创建它。

我无法解释你所经历的不一致行为;对我来说,它无条件地失败了(尽管我第一次发现这是在尝试在不同的应用程序域之间编组图像时,而不是手动序列化它们)。

我不确定,但我倾向于XP和Windows 7不同的安全模型。Image继承自System.MarshalByRefObject。在执行序列化时,应用程序域之间可能正在进行代理。此代理可能在Windows 7中被禁止。

http://msdn.microsoft.com/en-us/library/system.marshalbyrefobject%28v=vs.71%29.aspx

相关文章:
  • 没有找到相关文章