0

DataContractSerializer を使用すると、異常な動作が見られます。次のようにメッセージ コントラクトを定義しました。

namespace MyNamespace.DataContracts
{
[MessageContract(WrapperName = "order", WrapperNamespace = @"http://example.com/v1/order")]
public class MyOrder
{
    [MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 1)]
    public MyStore store;

    [MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 2)]
    public MyOrderHeader orderHeader;

    [MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 3)]
    public List<MyPayment> payments;

    [MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 4)]
    public List<MyShipment> shipments;
}
.
.

次のような XML メッセージを送信しています。

<?xml version="1.0" encoding="utf-8"?>
<order xmlns="http://example.com/v1/order>
    <store>
    ...
    </store>
    <orderHeader>
    ...
    </orderHeader>
    <payments>
        <payment>
        ...
        </payment>
    </payments>
    <shipments>
        <shipment>
        ...
        </shipment>
    </shipments>
</order>

私のサービスは、期待どおりにこの XML を逆シリアル化します。私のサービス内では、DataContractSerializer を使用して XML 文字列を作成していますが、ここで奇妙なことが起こります。私は次のようにシリアライザーを使用しています:

DataContractSerializer serializer = new DataContractSerializer(typeof(MyOrder));

using (MemoryStream ms = new MemoryStream())
{
    serializer.WriteObject(ms, order);                    
    ms.Position = 0;
    StreamReader sr = new StreamReader(ms);
    string outputMessage = sr.ReadToEnd();
}

これが完了すると、outputMessage に次の XML が含まれます。

<?xml version="1.0" encoding="utf-8"?>
    <MyOrder xmlns="http://example.com/v1/order" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <order>
            <store>
            ...
            </store>
            <orderHeader>
            ...
            </orderHeader>
            <payments>
                <payment>
                ...
                </payment>
            </payments>
            <shipments>
                <shipment>
                ...
                </shipment>
            </shipments>
        </order>
    </MyOrder>

言うまでもなく、元の XML メッセージを受信することを期待しているものは、これを解析できません。だから私は2つの質問があると思います:

  1. DataContractSerializer が余分な外部ノードを XML 出力に追加するのはなぜですか?
  2. これをやめる方法はありますか?

ありがとう。

これはおそらく.NET 4を使用していることを追加する必要があります。

4

1 に答える 1

0

WriteObjectContentの代わりに を使用することもできますWriteObjectが、提供されたコードを使用して問題を再現することはできません。メッセージ コントラクトの一部であるすべての追加のクラス定義は、私の定義では空ですが、これは取得している XML です。

<MyOrder xmlns="http://schemas.datacontract.org/2004/07/SandboxApp"
         xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <orderHeader i:nil="true"/>
    <payments i:nil="true"/>
    <shipments i:nil="true"/>
    <store i:nil="true"/>
</MyOrder>

を無視しているように見えるので、これも奇妙に思えWrapperNameます。.NET 3.5 SP1 と .NET 4.0 でも同じ結果です。

于 2010-05-20T17:42:28.693 に答える