C# WCF图像序列化
我的WCF服务中有以下代码:C# WCF图像序列化,c#,wcf,image,C#,Wcf,Image,我的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 :
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()方法时会发生此错误:
尝试序列化参数时出错。InnerException消息为“Type”System.Drawing.Bitmap”,数据协定名称为“位图”:http://schemas.datacontract.org/2004/07/System.Drawing“不期望”。< /强>考虑使用DATACONTRORTCORDEVER或在已知类型的列表中添加静态不知道的任何类型。通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。”
我的代码是在Visual Studio 2010 Pro中构建的C#Framework 4.0中编写的
请帮助,提前感谢。数据合同预期为
Image
,但它得到了一个位图:Image
实例。WCF喜欢提前了解继承,所以您需要告诉它。但是老实说,我认为这不是一个好办法;实际上,您应该直接抛出原始二进制文件,这可能意味着首先将图像
保存到内存流
。你也应该正式装饰你的合同类型。我将发送:
[DataContract]
public class MyImage
{
[DataMember]
public byte[] Image { get; set; }
[DataMember]
public string FullPath { get; set; }
}
获取字节[]
的示例:
using(var ms = new MemoryStream()) {
image.Save(ms, ImageFormat.Bmp);
return ms.ToArray();
}
正如您在这里看到的:图像是不可序列化的。因此,您可以将图像转换为字节数组(您喜欢的任何格式,从像素颜色到官方格式(如PNG))并使用该System.Drawing.image具有SerializableAttribute,因此我认为它是可序列化的。请参见此处以获取参考:该属性不适用于xml序列化。WCF使用DataContractSerializer。它使用XML序列化。好的,我将把它转换成字节[]。谢谢。我使用Image.FromFile()方法获取图像,而不使用位图类。如何将图像转换为字节[]?