C++クライアントがsvcutil+wsutilによって生成されたプロキシを使用して通信するWCFWebサービスがあります。新しいDataMemberを追加しましたが、次のようになります。
WS_READ_OPTION '2'、名前'GetMachineRequestDetailsResponse'、名前空間'M.NativeOM'の要素を読み取るときに、シリアル化の失敗が発生しました。WS_TYPE '26(0x1A)'、WS_FIELD_MAPPING '2'、名前'GetMachineRequestDetailsResult'、および名前空間'M.NativeOM'のフィールドを読み取るときに、シリアル化の失敗が発生しました。XMLリーダーが入力ソースを処理しているときに、行1、列796(0x31C)でエラーが発生しました。終了要素が期待されていました。; 名前が「UseForRun_SnapshotID 」で名前空間が「M.NativeOM」の開始要素が見つかりましたが、予期されていませんでした。;
データコントラクトに含まれるデータメンバーは、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属性を使用すると、DataMembersは正しい順序になりましたが、私のクライアントは新しいDataMemberを無視するだけでなく、代わりにエラーを出します。