0

生成されたXMLを制御する方法を誰かが説明できますか?

簡単なテストクラス、NumberServiceがあります...

[Serializable]
public class NumberService
{
    public int Number1 { get; set; }
    public int Number2 { get; set; }
}

XmlSerializerを使用してインスタンスを逆シリアル化すると、期待どおりの結果が得られます...

<NumberService>
  <Number1>23</Number1>
  <Number2>45</Number2>
</NumberService>

しかし、私はこれを送信しようとしていて、Fiddlerが表示していました...

<NumberService>
<_x003C_Number1_x003E_k__BackingField>10</_x003C_Number1_x003E_k__BackingField>
<_x003C_Number2_x003E_k__BackingField>2</_x003C_Number2_x003E_k__BackingField>
</NumberService>

これは自動プロパティを使用しているためであり、実際に次のように変更した場合は...

public class NumberService
{
    private int _number1;
    public int Number1
    {
        get { return _number1; }
        set { _number1 = value; }
    }

    public int Number2 { get; set; }
}

実際、XMLは次のように変更されます...

<NumberService>
<_number1>4</_number1>
<_x003C_Number2_x003E_k__BackingField>6</_x003C_Number2_x003E_k__BackingField>
</NumberService>

しかしもちろん、プロパティと競合するため、_number1をNumber1に変更することはできません:-(

では、どのようにしてXMLを制御できますか?

...そしてもう少し読んで...

これには、WCFデータ契約が含まれます

4

3 に答える 3

2

これは、DataContractSerializerがSerializable属性が適用されたアイテムを処理する方法と関係があります。

Serializable属性に直面すると、DataContractSerializerは、 IFormatter実装でインスタンスを使用するときに期待するセマンティクスに従います。つまり、フィールドの名前をデータのキーとして使用して、基になるフィールドをシリアル化します。

自動生成されたプロパティを使用しているため、実際には、コンパイラが生成する自動生成されたフィールドの名前が表示されます。

これを回避するには、DataContract属性をクラスに適用し、DataMember属性をプロパティに適用する必要があります(プロパティ名と異なるようにする場合は、属性で指定することで名前を制御できます)。

DataContract / DataMember属性をまったく指定せず、POCODataContractシリアル化を使用するオプションもあります。これは、パブリックプロパティ/フィールドのシリアル化のみに加えて、デフォルトのパラメータなしコンストラクタがあることを前提としています。

于 2010-11-29T20:18:14.207 に答える
1

[Serializable]属性を削除する必要があります。XMLシリアル化では使用されず、データコントラクトシリアライザーに間違ったメッセージを送信しています。

于 2010-11-29T21:14:56.760 に答える
0

XmlSerializationのみを使用している場合は、System.Xml.Serialization名前空間の属性を使用して、Xml-Serialization(XmlAttributeAttributeなど)を制御できます。

WcfサービスでDataContractSerializerを使用する場合は、クラスをDataContract属性でマークし、すべてのプロパティをDataMember属性でマークする必要があります。

IMHO DataContractSerializerは、古いXmlSerializationよりもはるかに高度です

于 2010-11-29T20:14:12.693 に答える