2009-03-25 4 views
1

私は、これがこのXMLとDataContractSerializer

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

のようなXMLを生成したいこの

[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); } 
    } 
} 

のようなクラスを持っていますが、より多くのようなものを取得していますこれを修正するには? This articalは、DataContractSerializerの欠点の一つであることを述べていない:

  1. オブジェクトは不思議に私をリードする名前と注文

設定の外にシリアライズされる方法を制御すること、これはされています解ける問題ではありません。


私は、私はちょうどそれを行うコードを削除することになってるので、これはIXmlSerializableReadXml/WriteXmlで行うことができます知られています。

答えて

1

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

あなたはFooクラスをそのまま残すことができ、DataContractSerializerは残りの部分を処理します。私は私の最初の答えを実現

+0

しかし、どのようにこのシナリオでは、「バー」クラスの追加プロパティに対処するのでしょうか? –

+0

これは*正確に*私はコードを取り除くとタックされています:) – BCS

+0

@ marc_s&BCS:IXmlSerializableを実装すると、DataContractSerializerはその実装を出力に使用するので、実装者が何をするかを決める追加のプロパティ。 – casperOne

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; 
} 
関連する問題