WCF DataContract反序列化缺少3个字符串字段,即使使用Order集也是如此

时间:2010-11-25 09:37:07

标签: .net xml wcf serialization deserialization

我有一项服务,它从WebApp中托管的代理接收数据。 DataMembers设置为Order = *,我也尝试添加isRequired = true。问题是,在序列化和反序列化的60个信息字段中,相同的3个字符串字段始终缺失(null)。我运行调试,向我显示数据从客户端浏览器到代理服务完整(从JSON序列化)。然后,代理服务将其发送到反序列化后缺少3个字段的Windows服务。

我尝试过以不同方式设置字段的顺序,但似乎没有任何效果。它总是与3个缺失字段相同的简单字符串,通常不超过10-20个字符。值得一提的是,这些麻烦的DataMembers正确填充在该计划的所有其他领域。

代理服务代码如下

 public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)
    {
        MyService.MyServiceClient proxy = new MyService.MyServiceClient("WSHttpBinding_IMyService");
        proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
        TransactionResult result = proxy.Update(obj, ItemOne, ItemTwo);
        proxy.Close();
        return result;
    }

Windows服务代码

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)
{obj is missing same 3 values at this point...}

对象的一个​​DataMembers的示例

[DataMember(Order = 56)]
    public String ItemTwo
    {
        get
        {
            ...
        }
        set
        {
            ...
        }
    }

2 个答案:

答案 0 :(得分:0)

思路:

  • 确保不会计算这些字段(因此在代码中重置或更改,具体取决于deserializatin顺序)
  • 确保您没有定义DefaultValue属性,因为序列化使用它来优化bandwith
  • 确保您没有声明某些会破坏这些字段的自定义行为
  • 尝试另一个WCF绑定(HTTP,NETTCP,...)
  • 挂钩OnDeserialized,OnDeserializing事件并检查数据是否存在

答案 1 :(得分:0)

要检查的一件事可能是签名中的其他参数与您实体上的属性具有相同的名称。

为什么不重命名签名参数(记得重新生成客户端服务引用/代理)

public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)

public TransactionResult Update(MyObj obj, String NewItemOne, String NewItemTwo)