WCF和System.Drawing.Color

时间:2011-11-17 08:47:31

标签: wcf

感谢您快速回答所有问题。但我正在寻找一个答案,而不是一个解决方法(序列化为字符串),因为我想知道如何使用框架中的其他类型

我相当擅长WCF,但我认为我还处于初学阶段,因为我无法序列化System.Drawing.Color。

这是我的服务合同

using System.Drawing;
using System.ServiceModel;

namespace wcfServer
{

    [ServiceContract]
    public interface IColorService
    {
        [OperationContract]
        Color DoWork();
    }
}

这是一个实现

public class ColorService : IColorService
{
    public Color DoWork()
    {
        return Color.Yellow;
    }
}

但是,在客户端WCF不使用System.Drawing.Color但它生成自己的颜色类型(结构)?

最终结果是黄色不会到达客户端

我认为这不是问题,因为.net Color类型标有serializable属性

亲切的问候,汤姆

3 个答案:

答案 0 :(得分:3)

颜色通常是一团糟 - 它们有很多。只需将颜色转换为32位ARGB结构(Color类有一个执行此操作的方法)并在WCF界面中使用它。如果你想要格外小心,用A,R,G和B定义你自己的结构(作为字节,WPF将它们作为双精度,但没有人真正需要它),并将你的服务与任何特定的UI平台分离。

答案 1 :(得分:1)

  

但是,在客户端WCF不使用System.Drawing.Color但它生成自己的颜色类型(结构)? [...]我认为这不是问题,因为.net Color类型标有serializable属性

我假设你在这里使用basicHttp或wsHttp。我所说的并不适用于所有绑定。

WCF服务和客户端之间的通信与.NET无关。关键字是互操作性。客户端不必用.NET编写,它可能是PHP或Java或任何类型的客户端。

因此,WCF使用SOAP来发送和接收所有主要编程语言都实现的数据。因此,要让服务和客户端交换数据,必须定义该数据的格式。你不能说“嘿,我要发送一个System.Drawing.Color”,因为这很可能不是客户语言中的有效类或结构定义。

因此,您的服务定义了一个包含模式定义的WSDL,其中Color结构的内容将从System.Drawing.Color复制。它不会被链接到.NET框架,从它被序列化并通过网络发送。

答案 2 :(得分:0)

我能够通过在数据协定上使用“KnownTypeAttribute”来解决此问题。因此,您可以在服务合同上尝试“ServiceKnownTypeAttribute”,如下所示:

[ServiceContract]
[ServiceKnownType(typeof(System.Drawing.Color))]
public interface IColorService
{
    [OperationContract]
    Color DoWork();
}

假设客户端代码也使用.NET,这很好。 “KnownType”策略在我的项目http://www.nquotes.net/中运行良好,让我避免了额外的序列化麻烦。它们应该包含Color作为基本类型之一(例如,与Guid一样,它自动“已知” - http://msdn.microsoft.com/en-us/library/ms731923.aspx)。