感谢大家的快速回答。但是我正在寻找答案,而不是解决方法(序列化为字符串),因为我想知道如何使用框架中的其他类型。
我很擅长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颜色类型是用可序列化属性标记的
向你问好,汤姆
发布于 2011-11-17 09:26:05
但是,在客户端,
不使用System.Drawing.Color,但它生成自己的颜色类型(结构)?我认为这不是一个问题,因为.net颜色类型是用可序列化属性标记的
我假设您在这里使用basicHttp或wsHttp。我说的并不是所有的绑定。
WCF服务与客户端之间的通信与.NET无关。关键词是互操作性。客户机不必使用.NET编写,它很可能是PHP或其他类型的客户机。
因此,WCF使用SOAP来发送和接收数据,所有主要编程语言都会实现这些数据。因此,为了让服务和客户端交换数据,必须定义该数据的格式。您不能说“嘿,我要发送一个System.Drawing.Color",因为这很可能不是客户端语言中的有效类或结构定义。
因此,您的服务定义了一个WSDL,其中包含一个模式定义,其中Color结构的内容将从System.Drawing.Color复制。它不会从序列化并通过连线发送到.NET框架。
发布于 2011-11-17 08:51:35
颜色通常是乱七八糟的--它们太多了。只需将颜色转换为32位ARGB结构( color类有一个这样做的方法),并在WCF接口中使用它。如果您想要格外小心,请用A、R、G和B定义您自己的结构(作为字节,WPF将它们作为双数,但没有人真正需要它们),并将您的服务与任何特定的UI平台分离。
发布于 2012-09-22 18:50:14
我能够通过在数据契约上使用"KnownTypeAttribute“来解决这个问题。因此,您可以在这样的服务合同上尝试"ServiceKnownTypeAttribute“:
[ServiceContract]
[ServiceKnownType(typeof(System.Drawing.Color))]
public interface IColorService
{
[OperationContract]
Color DoWork();
}假设客户端代码也在使用.NET,这很好。在我的项目http://www.nquotes.net/中,使用"KnownType“的策略很好,让我避免了额外的序列化麻烦。它们应该包括颜色作为基本类型之一(例如,它们使用Guid,这是自动- http://msdn.microsoft.com/en-us/library/ms731923.aspx )。
https://stackoverflow.com/questions/8164315
复制相似问题