我正在尝试将 BitmapSource 从我的 WCF 服务发送到我的客户端应用程序。两者都是 .NET 3.5 应用程序。我似乎能够毫无问题地序列化对象(没有发生异常),但我对客户端的回调从未被调用。在我的客户端上添加跟踪以记录异常后,我看到 DataContractSerializer 无法反序列化位图源。
错误是:"元素'http://schemas.datacontract.org/2004/07/Test.VisionStudio.Remote:Image'包含'http://schemas.datacontract.org/2004/07/System.Windows.Interop:InteropBitmap'数据协定的数据。反序列化程序不知道映射到此协定的任何类型的内容。将与"InteropBitmap"对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。
因此,我按照它所说的做了,并将已知类型添加到服务协定和回调协定中,但我仍然收到相同的错误。
这是我发送的服务回调协定和数据协定(删除不相关的数据成员):
[ServiceKnownType(typeof(BitmapSource))]
[ServiceKnownType(typeof(InteropBitmap))]
public interface IZynVisionStudioRemoteServiceCallback
{
[OperationContract(IsOneWay=true)]
void OnVisionResultsReady(RemoteVisionProductResult result);
[OperationContract(IsOneWay = true)]
void ServiceShuttingDown();
}
[DataContract]
public class RemoteVisionProductResult
{
private bool _status;
/// <summary>
/// Status of the overall inspection. Pass = True, Fail = False
/// </summary>
[DataMember]
public bool Status
{
get { return _status; }
set { _status = value; }
}
private string _product;
/// <summary>
/// Name of the product the results came from
/// </summary>
[DataMember]
public string Product
{
get { return _product; }
set { _product = value; }
}
private string _inspection;
/// <summary>
/// Name of the inspection the results came from
/// </summary>
[DataMember]
public string Inspection
{
get { return _inspection; }
set { _inspection = value; }
}
private List<RemoteVisionImage> _images = new List<RemoteVisionImage>();
[DataMember]
public List<RemoteVisionImage> Images
{
get { return _images; }
set { _images = value; }
}
private List<RemoteVisionImage> _imagesWithGraphics = new List<RemoteVisionImage>();
[DataMember]
public List<RemoteVisionImage> ImagesWithGraphics
{
get { return _imagesWithGraphics; }
set { _imagesWithGraphics = value; }
}
}
[DataContract]
public class RemoteVisionImage
{
/// <summary>
/// Image uploaded from the vision system
/// </summary>
[DataMember]
public BitmapSource Image { get; set; }
/// <summary>
/// Name of the camera the image was uploaded from
/// </summary>
[DataMember]
public string Camera { get; set; }
public RemoteVisionImage()
{
}
}
谁能帮我弄清楚为什么我不能通过网络发送此图像?
编辑:我应该补充一点,我的客户端按预期更新服务引用,并与服务共享程序集,因此RemoteVisionProductResult和RemoteVisionImage的实现也在客户端上。
我过去通过实现读取/写入的序列化和反序列化方法解决了类似的问题(为 BimapSources 创建 VS 调试可视化工具):
- 格式
- (像素格式)
- 像素高度
- 像素宽度
- 跨
- 缓冲区
在序列化程序中
使用 CopyPixels(Int32Rect, IntPtr, Int32, Int32)
并在反序列化器中Create(Int32, Int32, Double, Double, PixelFormat, BitmapPalette, IntPtr, Int32, Int32)
。
不幸的是,我没有源代码,但是,实现非常简单。
此问题已通过以下方式解决:向 DataContract 添加 Bitmap 属性,在服务端从 BitmapSource 转换为 Bitmap,通过网络发送它,然后使用调色板和 Bitmap 中的其他属性在客户端重新生成 BitmapSource。