我的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中构建。
请提前帮助,谢谢。
答案 0 :(得分:15)
预期数据合约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();
}
答案 1 :(得分:1)
正如您可以在此处阅读:Need serialize bitmap image silverlight图像不可序列化。因此,您可以将图像转换为字节数组(您喜欢的任何格式,从像素颜色到PNG等官方格式)并使用