我有一个DataMember(isRequired:= True),该属性称为FillerInd。现在,您如何判断该字段是空还是不存在?我正在网上阅读,你必须做一些XML的序列化和反序列化,如果它需要缺少字段,它将抛出异常MissingMethodException。我不知道如何实现这个,或者这是最好的选择。任何有助于我进入正确道路的帮助我都会非常感激。
答案 0 :(得分:4)
DataMember属性IsRequired
告诉您该属性是否必须在线上:它是否应该出现在消息中。这会导致异常的典型情况是服务通过添加具有IsRequired = true
的属性来更新DataContract,而不通知客户端。客户端将发送不包含该属性的序列化对象,从而导致抛出异常。
一种不太典型的情况,但使用基本类型的属性重现此问题的简单方法是将EmitDefaultValue属性显式设置为false。如果执行此操作,然后尝试使用该DataContract的对象调用操作,则可能会引发异常。考虑这个例子:
// Data Contract
[DataContract]
public class Animal
{
[DataMember(IsRequired = true, EmitDefaultValue = false)]
public string Name;
}
// IService
[OperationContract]
int GetIdentifier(Animal animal);
// Client operation
int id = client.GetIdentifier(new Animal()); // Causes exception
这会导致SerializationException(反过来导致CommunicationException),并带有以下行的消息:
类型中的成员名称....动物无法序列化。此异常通常是由于尝试使用不允许空值的空值引起的。 'Name'成员设置为其默认值(通常为null或零)。该成员的EmitDefault设置为“false”,表示该成员不应序列化。但是,成员的IsRequired设置为“true”,表示必须序列化。这种冲突无法解决。考虑将“名称”设置为非默认值。或者,您可以将DataMemberAttribute属性上的EmitDefaultValue属性更改为true,或将IsRequired属性更改为false。
请注意,如果您绕过此问题客户端(例如,通过编辑生成的服务引用的reference.cs以便在客户端不再需要DataMember),则在反序列化时服务将遇到异常,我相信会导致错误。
转到您的具体评论和问题。
您无需做任何事情来判断该字段是否为空:WCF框架会为您处理此问题。如果需要的话,我想你可以挂钩(de)序列化来解决这个问题,甚至在处理之前检查消息。
正如我所说,这种情况会导致SerializationExceptions和CommunicationExceptions,而不是MissingMethodException。
你是否需要“IsRequired”以及它是否是“最佳路线”,我不知道。当然,这取决于你的情况。