【问题标题】:WCF Image SerializingWCF 图像序列化
【发布时间】:2012-01-26 06:18:41
【问题描述】:

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

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

请帮忙,提前谢谢。

【问题讨论】:

    标签: c# wcf image


    【解决方案1】:

    数据合约需要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();
    }
    

    【讨论】:

    • 我使用 Image.FromFile() 方法来获取图像,而不使用 Bitmap 类。如何将 Image 转换为 Byte[]?
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多