在项目中使用Visual Studio 2013
时,Add Service Reference
如何反序列化对象?我问,因为我有以下课程:
public class RTMImagePackage
{
private int maxImages = 15;
[DataMember(EmitDefaultValue = false)]
public int MaxImages
{
get { return this.maxImages; }
private set { this.maxImages = value; }
}
[OnDeserialized]
void OnDeserialized(StreamingContext c)
{
if (maxImages == 0)
{
maxImages = 15;
}
}
}
如果我使用本地IIS自托管,然后创建一个单独的项目并使用Add Service Reference
添加此WCF服务,则RTMImagePackage
的任何新实例的MaxImages
值始终为0,即使我在多个地方将它设置为15,甚至在以OnDeserialized
开头的方法中也是如此。
如果我抛出一些断点,我可以看到即使我尝试使用断点更新服务引用,也永远不会在Web服务端调用OnDeserialized
方法。
基本上我试图保证客户端在生成代理类 WITHOUT 必须使用分部类时始终将MaxImages
设置为15。有明确的方法吗?我已经检查了其他答案,他们的方法是使用OnDeserialized
或OnDeserializing
,但这似乎并不适用于我。
任何提示?
答案 0 :(得分:4)
Visual Studio无法使用“添加服务引用”向导 1 来探测有关基础.NET类的信息。所有必须继续的是你的WCF服务生成的WSDL,并且WSDL没有任何方式可以说任何一个服务的具体类的数据成员都有一个带有初始值的支持字段价值15。
此外,您的客户无法知道您的班级'如果在反序列化期间当前为0,则OnDeserialized
方法将该字段设置为15。 OnDeserialized
是一种在服务从客户端接收数据时运行的方法。 OnDeserialized
方法的行为不会作为服务界面的一部分公开。
从我可以确定的,我没有看到任何在WCF界面中指示自定义默认值的方法,并且我在使用自定义默认值时可以找到的所有建议都推荐OnDeserialized
方法你已经在使用了。
但是,如果您使用ChannelFactories而不是Add Service Reference生成的代理,您的客户端应用程序可以使用.NET定义作为服务数据对象,这些可以在您的服务和客户端之间共享。换句话说,您的客户端可以实例化在共享程序集中定义的RTMImagePackage
实例,而不是使用服务代理类。这应该允许你做一些事情,比如包括默认值和其他无法从WSDL中确定的东西。
有关ChannelFactories的更多信息,请访问: http://www.codeproject.com/Tips/558163/Difference-between-Proxy-and-Channel-Factory-in-WC
<小时/> 1 事实上,您的服务界面不应该首先在class
中定义。它应该在interface
。中定义
答案 1 :(得分:0)
我不确定OnDeserialized
方法是如何触发的,所以我不会说话。
基本序列化需要公开get
和set
个访问者。您已公开get
,但您的set
是私密的。将这两个设置为公共,您的对象应该正确序列化。