WCF映像序列化

本文关键字:序列化 映像 WCF | 更新日期: 2023-09-27 18:21:23

我的WCF服务中有以下代码:

public class MyImage
{
    public Image Image { get; set; }
    public string FullPath { get; set; }
}
[ServiceContract]
public interface IMyService
{
    [OperationContract] void SaveImage(MyImage myImg);
}
public class MyService : IMyService
{
    public void SaveImage(MyImage myImg)
    {
        // ...
    }
}

但是当我运行SaveImage()方法时会出现这个错误:

尝试序列化参数时出错http://tempuri.org/:e.InnerException消息为"类型"System.Drawing.Bitmap",数据协定名称为"Bitmap":http://schemas.datacontract.org/2004/07/System.Drawing不应为"考虑使用DataContractResolver或将任何未知类型静态添加到已知类型列表中,例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表。'

我的代码是C#,Framework 4.0,在Visual Studio 2010 Pro中构建的。

请帮忙,提前谢谢。

WCF映像序列化

数据协定需要Image,但它得到了一个Bitmap : Image实例。WCF喜欢提前了解继承,所以你需要告诉它。但是!老实说,我认为这不是一个好办法;实际上,您应该只抛出原始二进制文件——这可能意味着首先将Image保存为MemoryStream。你还应该正式装饰你的合同类型。我会发送:

[DataContract]
public class MyImage
{
    [DataMember]
    public byte[] Image { get; set; }
    [DataMember]
    public string FullPath { get; set; }
}

获取byte[]:的示例

using(var ms = new MemoryStream()) {
    image.Save(ms, ImageFormat.Bmp);
    return ms.ToArray();
}

正如您在这里所读到的:需要序列化位图图像silverlight图像是不可序列化的。因此,您可以将图像转换为字节数组(任何您喜欢的格式,从像素颜色到PNG等官方格式),并使用