首页 文章

WCF图像序列化

提问于
浏览
5

我的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消息是'Type'System.Drawing.Bitmap',数据协定名称为'Bitmap:http://schemas.datacontract.org/2004/07/System.Drawing'不是预期的 . 考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中 .

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

请提前帮助,谢谢 .

2 回答

  • 1

    数据合约预计 Image ,但它有一个 Bitmap : Image 实例 . WCF喜欢提前知道继承,所以你需要告诉它 . 但!老实说,我认为这不是一个好方法;你应该真的只是扔原始二进制 - 这可能意味着首先将 Image 保存到 MemoryStream . 您还应该正式装饰您的 Contract 类型 . 我会发送:

    [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();
    }
    
  • 15

    正如您可以在这里阅读的那样:Need serialize bitmap image silverlight图像不可序列化 . 因此,您可以将图像转换为字节数组(您喜欢的任何格式,从像素颜色到PNG等官方格式)并使用

相关问题