WCF和System.Drawing.Color

WCF和System.Drawing.Color,wcf,Wcf,谢谢大家的快速回答。但我在寻找答案,而不是解决方法(序列化为字符串),因为我想知道如何使用框架中的其他类型 我相当擅长WCF,但我认为我仍处于初学者阶段,因为我无法序列化System.Drawing.Color 这是我的服务合同 using System.Drawing; using System.ServiceModel; namespace wcfServer { [ServiceContract] public interface IColorService {

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

我相当擅长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颜色类型用serializable属性标记


亲切的问候,汤姆。颜色通常都是一团糟——颜色太多了。只需将color转换为32位ARGB结构(color类有一个这样做的方法),并在WCF接口中使用它。如果您想格外小心,请使用A、R、G和B定义您自己的结构(作为字节,WPF将它们作为双倍,但没有人真正需要),并将您的服务与任何特定的UI平台分离。

颜色通常是一团乱——它们太多了。只需将color转换为32位ARGB结构(color类有一个这样做的方法),并在WCF接口中使用它。如果您想格外小心,可以使用A、R、G和B定义您自己的结构(作为字节,WPF将它们作为双倍,但没有人真正需要),并将您的服务与任何特定的UI平台分离

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

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

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

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

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

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

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

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

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


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

我通过在数据契约上使用“KnownTypeAttribute”解决了这个问题。因此,您可以在服务合同上尝试“ServiceKnownTypeAttribute”,如下所示:

[ServiceContract]
[ServiceKnownType(typeof(System.Drawing.Color))]
public interface IColorService
{
    [OperationContract]
    Color DoWork();
}
假设客户端代码也在使用.NET,那么这种方法就可以很好地工作。
“KnownType”的策略在我的项目中运行良好,让我避免了额外的序列化麻烦。它们应该将颜色作为基本类型之一(例如,与Guid一样,它是自动“已知”的-)。

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

[ServiceContract]
[ServiceKnownType(typeof(System.Drawing.Color))]
public interface IColorService
{
    [OperationContract]
    Color DoWork();
}
假设客户端代码也在使用.NET,那么这种方法就可以很好地工作。
“KnownType”的策略在我的项目中运行良好,让我避免了额外的序列化麻烦。它们应该将颜色作为基本类型之一(例如,与Guid一样,它是自动“已知”的-)。

返回所需颜色的字符串表示形式不是更容易吗?然后在客户身上涂上颜色。或者,您希望通过WCF发送颜色对象有什么具体原因吗?返回所需颜色的字符串表示形式不是更容易吗?然后在客户身上涂上颜色。或者您希望通过WCF发送颜色对象的具体原因是什么?这应该是可以接受的答案。不要序列化颜色,使用标准和简单的argb值而不是.NET类型。这应该是可以接受的答案。不要序列化颜色,请使用标准和简单的argb值,而不是.NET类型。