4

私は Web サービスの呼び出しを使用しており、クライアントで WCF によって生成されたサービス参照を使用しています。テスト サービスから受信した XML 応答をディスクに保存しました (SOAP エンベロープとボディ タグなし)。それらをディスクから読み込み、そこからオブジェクトを作成したいと考えています。私のWebサービスから次のメソッドを取りましょう:

SomeMethodResponse SomeMethod(SomeMethodRequest req)

手動で (SOAP UI を使用して) ディスクへの応答をファイルに保存します。応答の例:

<SomeMethodResponse xmlns="http://myNamespace">
    <SomeMember1>value</SomeMember1>
</SomeMethodResponse>

次に、次を使用してファイルからオブジェクトを逆シリアル化しようとします。

DataContractSerializer dcs = 
  new DataContractSerializer(typeof(SomeMethodResponse))

これは失敗します。シリアライザーは、名前空間 ' http://schemas.datacontract.org/2004/07 ' に要素が必要であるが、' http://myNamespace 'に要素が見つかったというエラーで不平を言います。

質問:DataContractSerializer SomeMethodResponseType で宣言されている名前空間を使用しないのはなぜXmlTypeAttribute(Namespace="http://myNamespace")ですか?

DataContractSerializer名前空間とルート要素をコンストラクターに明示的に指定することで、これを回避できます。しかし、次のようなメッセージで失敗します。

行 X の位置 Y (XML ドキュメントの最後の行) にエラーがあります。'EndElement' '
名前空間 'httpmyNapespace' からの SomeMethodResponse は予期されていません。要素 'someNameField' が必要です。

SomeNameWeb サービスが使用している XSD の要素です。SomeMethodResponseこれは、 というプライベート フィールドに裏打ちされた型のプロパティでもありますsomeNameFieldDataContractSerializerプロパティに加えてフィールドを逆シリアル化しようとしているようです。

ディスクから保存した XML をデシリアライズし、SomeMethod が返すのと同じ型のオブジェクトを取得するにはどうすればよいですか?

ありがとう、マトラ

4

2 に答える 2

5

XML応答には明らかにXML名前空間があります。

<SomeMethodResponse xmlns="http://myNamespace">
    <SomeMember1>value</SomeMember1>
</SomeMethodResponse xmlns="http://myNamespace">

したがって、これを適切に読み取って逆シリアル化するには、DataContractSerializerにこの名前空間について通知する必要があります。

DataContractSerializer dcs = 
    new DataContractSerializer(typeof(SomeMethodResponse),
                               "SomeMethodResponse", "http://myNamespace")

コンストラクターでこのデフォルトのXML名前空間を指定することにより、このXMLを読み取って逆シリアル化できるようになります。

あなたが得ている他のエラー:

行Xの位置Y(XMLドキュメントの最後の行)にエラーがあります。'EndElement''名前空間'httpmyNapespace'からのSomeMethodResponseは予期されていません。要素'someNameField'が必要です。

これは、非常に珍しく、これまでに見たことのない、end要素に名前空間があるという事実が原因です。

</SomeMethodResponse xmlns="http://myNamespace">

その余分な不要な名前空間を削除するだけで、問題ないはずです。

</SomeMethodResponse>
于 2010-03-18T06:05:20.853 に答える
5

私自身の質問に答えさせてください: 2 番目のエラー メッセージの原因は、実際には、svcUtil が暗黙のうちにXmlSerializerinsted of の使用を選択したことですDataContractSerializer。のヘルプを読んでこれを見つけましたXmlTypeAttribute- The MSDn states Controls the XML schema that is generated when the attribute target is serialized by the XmlSerializer. ;-) だから私たちは昔に戻って、XmlSerializer

于 2010-03-18T07:41:16.263 に答える