1

こんな授業があります

[DataContract(Namespace = "")]
public class Foo
{
    [DataMember(Order = 0)]
    Bar bar;
}

[DataContract(Namespace = "")]
public class Bar
{
    Baz baz;

    [DataMember(Order = 0)]
    string TheBaz
    {
        get { baz.ToString(); }
        set { SomeOtherCode(value); }
    }
}

私はこれがこのようなXMLを生成したい

<Foo>
    <Bar>String from baz.ToString()</Bar>
</Foo>

しかし、次のようなものが得られています:

<Foo>
    <Bar><TheBaz>String from baz.ToString()</TheBaz></Bar>
</Foo>

これを修正することは可能ですか?この記事によると、DataContractSerializer の欠点の 1 つは次のとおりです。

  1. 名前と順序を設定する以外に、オブジェクトをシリアル化する方法を制御できない

これは解決可能な問題ではないのではないかと思います。


IXmlSerializableこれはand ReadXml/で実行できることを知ってWriteXmlいました。これは、まさにそれを行うコードを削除することになっているためです。

4

2 に答える 2

1

私の最初の答えは完全に偽物であることに気づきました-しかし、あなたはプロパティでカンニングすることができます:

[DataContract(Namespace = "")]
public class Foo
{
    [DataMember(Order = 0, Name="Bar")]
    private string BazString {
        get {
            return bar == null ? null : bar.TheBaz.ToString();
        }
        set {
            if(value == null) {
                bar = null;
            }
            else {
                if(bar == null) bar = new Bar();
                bar.TheBaz = value;
            }
        }
    }

    Bar bar;
}
于 2009-03-26T08:03:54.007 に答える
1

クラスに実装IXmlSerializableし、シリアル化すると出力されます。Bar<Bar>String from baz.ToString()</Bar>

Foo クラスはそのままにしておくことができDataContractSerializer、残りは が処理します。

于 2009-03-25T20:19:21.847 に答える