由于新的WCF DataMember,反序列化失败 我有一个WCF WebService,我的C++客户端使用一个由VCuTIL+WSUTIL生成的代理来进行对话。 我添加了一个新的DataMember,现在我得到:

由于新的WCF DataMember,反序列化失败 我有一个WCF WebService,我的C++客户端使用一个由VCuTIL+WSUTIL生成的代理来进行对话。 我添加了一个新的DataMember,现在我得到:,wcf,datamember,Wcf,Datamember,读取具有WS_READ_选项“2”、名称“GetMachineRequestDetailsResponse”和命名空间“M.NativeOM”的元素时发生序列化失败。;读取WS_类型为“26(0x1A)”、WS_字段映射为“2”、名称为“GetMachineRequestDetailsResult”和命名空间为“M.NativeOM”的字段时发生序列化失败。;XML读取器处理输入源时,第1行第796列(0x31C)发生错误。;预期会有一个结束元素。;已找到名为“UseForRun\u Snaps

读取具有WS_READ_选项“2”、名称“GetMachineRequestDetailsResponse”和命名空间“M.NativeOM”的元素时发生序列化失败。;读取WS_类型为“26(0x1A)”、WS_字段映射为“2”、名称为“GetMachineRequestDetailsResult”和命名空间为“M.NativeOM”的字段时发生序列化失败。;XML读取器处理输入源时,第1行第796列(0x31C)发生错误。;预期会有一个结束元素。;已找到名为“UseForRun\u SnapshotID”且命名空间为“M.NativeOM”的起始元素,但不是预期的

datacontract中的My data成员是使用Order属性定义的:

[DataMember(Order = 4)]
        public int MachineID { get; set; }
        [DataMember(Order = 5)]
        public string MachineName { get; set; }

        [DataMember(Order = 3)]
        public bool IsReserved { get; set; }

        [DataMember(Order = 13)]
        public string ReservedBy { get; set; }

        [DataMember(Order = 12)]
        public MdMachineRequestType RequestType { get; set; }

        [DataMember(Order = 0)]
        public bool CommandIsAdmin { get; set; }
        [DataMember(Order = 1)]
        public string CommandLine { get; set; }
        [DataMember(Order = 2)]
        public int CommandTimeout { get; set; }

        [DataMember(Order = 7)]
        public string MoveToDb_ServerName { get; set; }
        [DataMember(Order = 6)]
        public string MoveToDb_DatabaseName { get; set; }

        [DataMember(Order = 11)]
        public int Reimage_OsID { get; set; }
        [DataMember(Order = 8)]
        public int Reimage_ImageID { get; set; }
        [DataMember(Order = 9)]
        public int Reimage_OptionTimeout { get; set; }
        [DataMember(Order = 10)]
        public string Reimage_OptionUserName { get; set; }

        [DataMember(Order = 15)]
        public int UseForRun_RunID { get; set; }
        [DataMember(Order = 14)]
        public bool UseForRun_DoCleanInstall { get; set; }

        [DataMember(Order = 16)]
        public int UseForRun_SnapshotID { get; set; }
此外,生成的xsd文件按正确的顺序显示它们

  <xs:complexType name="MdMachineRequest">
    <xs:sequence>
      <xs:element minOccurs="0" name="CommandIsAdmin" type="xs:boolean" />
      <xs:element minOccurs="0" name="CommandLine" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CommandTimeout" type="xs:int" />
      <xs:element minOccurs="0" name="IsReserved" type="xs:boolean" />
      <xs:element minOccurs="0" name="MachineID" type="xs:int" />
      <xs:element minOccurs="0" name="MachineName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="MoveToDb_DatabaseName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="MoveToDb_ServerName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="Reimage_ImageID" type="xs:int" />
      <xs:element minOccurs="0" name="Reimage_OptionTimeout" type="xs:int" />
      <xs:element minOccurs="0" name="Reimage_OptionUserName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="Reimage_OsID" type="xs:int" />
      <xs:element minOccurs="0" name="RequestType" type="tns:MdMachineRequestType" />
      <xs:element minOccurs="0" name="ReservedBy" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="UseForRun_DoCleanInstall" type="xs:boolean" />
      <xs:element minOccurs="0" name="UseForRun_RunID" type="xs:int" />
      <xs:element minOccurs="0" name="UseForRun_SnapshotID" type="xs:int" />
    </xs:sequence>
  </xs:complexType>


因此,使用Order属性确实将DataMember放在了正确的顺序中,但我的客户端并没有忽略新的DataMember,而是给出了一个错误。

问题是,当我使用wsutil创建代理时,我缺少/ignoreTrailingContent选项