2009-04-01 12 views
13

私は新しい.NET 3.0 DataContractSerializerを使用しています。私はNullable < >とList <>オブジェクトをシリアル化しようとしています。例:出力XMLにオプションの(つまりNullable <>およびList <>)要素を作成しないようにDataContractSerializerを設定できますか?

[DataContract(Namespace = "")] 
class Test 
{ 
    public static void Go() 
    { 
     Test test = new Test(); 

     var dcs = new DataContractSerializer(typeof(Test)); 
     dcs.WriteObject(new StreamWriter("test.xml").BaseStream, test); 
    } 

    [DataMember] 
    public Nullable<int> NullableNumber = null; 

    [DataMember] 
    public int Number = 5; 

    [DataMember] 
    public List<int> Numbers = new List<int>(); 
} 

.NETはヌルまたは空のリストをシリアライズする場合XMLに、それが(空白可能のために)ゼロに入れ、空(リストの)要素。上記の例では、生成します。

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Number>5</Number> 
</Test> 

を実際に、上記のファイルのデシリアライズを:私はそうのように、余分NullableNumberと番号の要素を排除したい記述するための時間を持っていない理由のために

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <NullableNumber i:nil="true"/> 
    <Number>5</Number> 
    <Numbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
</Test> 

シリアライザはうまくいきます。

ありがとうございました!

答えて

24

マーク少なくともNULL可能値型のケースのために働くだろう

[DataMember(EmitDefaultValue=false)] 

とフィールド。 Listの場合、必要になるまでリストの作成を延期する必要があります。そうでない場合は、シリアライゼーション前にメンバーが空の場合はメンバーをnullにします。

1

私は同じことが本当に必要でしたが、生成されたRIAクラスの多くのフィールドにグローバルに適用されました。このXMLがデシリアライズのためにDataConstractに受け入れられるかどうかはわかりません。しかし、それは私の目的をスイートにして読むことができます...

public override string ToString() 
    { 
     var doc = XDocument.Parse(this.ToXML()); 
     WalkElement(doc.Root); 
     return doc.ToString(SaveOptions.None); 
    } 
    void WalkElement(XElement e) 
    { 
     var n = e.GetNamespaceOfPrefix("i"); 
     if (n != null) 
     { 
      var a = e.Attribute(n + "nil"); 
      if (a != null && a.Value.ToLower() == "true") 
       e.Remove(); 
     } 
     foreach (XElement child in e.Elements().ToList()) 
      WalkElement(child); 
    } 
関連する問題