2009-04-01 5 views
13

Używam nowego DataContractSerializer .NET 3.0. Mam zarówno Nullable < > i listy <> obiektów zamierzam serializować. Przykład:Czy można skonfigurować obiekt DataContractSerializer tak, aby nie tworzył elementów opcjonalnych (tj. Elementów Nullable <> i List <>) w wyjściowym pliku XML?

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

Kiedy .NET serializes null lub pustą listę, to stawia w zera (dla Nullable) i puste (dla listy) elementów do XML. Powyższy przykład generuje:

<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> 

względów nie mam czasu, aby opisać Chciałbym, aby wyeliminować zbędne NullableNumber i numery elementów, tak jak poniżej:

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

Rzeczywiście, powyższe deserializes plików z serializerem w porządku.

Dzięki za pomoc!

Odpowiedz

24

Zaznaczyć pole

[DataMember(EmitDefaultValue=false)] 

który będzie działał przez co najmniej o wartości pustych przypadku typu wartość. W przypadku listy można potrzebować odłożyć tworzenie listy do momentu, gdy będzie ona potrzebna, lub zrezygnować z jej członu, jeśli jest pusta przed serializacją.

1

Naprawdę potrzebowałem tego samego, ale zastosowałem globalnie do wielu pól w wygenerowanych klasach RIA. Nie jestem pewien, czy ten XML jest akceptowalny dla DataConstract do deserializacji. Ale to jest czytelne, które apartamenty moje cele ...

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); 
    } 
Powiązane problemy