感谢您快速回答所有问题。但我正在寻找一个答案,而不是一个解决方法(序列化为字符串),因为我想知道如何使用框架中的其他类型
我相当擅长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属性
亲切的问候,汤姆
答案 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)。