2011-01-10 13 views
1

Ich habe eine Liste von Objekten, die eine gemeinsame Schnittstelle implementieren. Wenn ich versuche, es einfach zu serialisiert bekomme ich eine schöne Ausnahme, die mir sagt, dass die Serializer nicht Schnittstellen serialisiert werden kann:XmlSerializer Fehler Serialisierung Schnittstelle Objekte

private readonly ObservableCollection<ICanHasInterface> children = new ObservableCollection<ICanHasInterface>(); 
public ObservableCollection<ICanHasInterface> Children 
{ 
    get { return children; } 
} 

=> „Kann nicht Mitglied serialisiert ... vom Typ ... weil es sich um eine Schnittstelle“
Anscheinend fragt der Serializer den Typ der Objekte ab und markiert das XmlElement mit dem Attribut xsi:type (was getan wird, wenn ein Objekt von einer anderen Klasse erbt) ist zu viel. So
, weil ich nicht will IXmlSerializable implementieren, dachte ich eine Abhilfe auf die vielversprechenden zunächst aussah:

private readonly ObservableCollection<ICanHasInterface> children = new ObservableCollection<ICanHasInterface>(); 
[XmlIgnore()] 
public ObservableCollection<ICanHasInterface> Children 
{ 
    get { return children; } 
} 

[XmlElement("Child")] 
public List<object> ChildrenSerialized 
{ 
    get 
    { 
     return new List<object>(Children); 
    } 
    set 
    { 
     Children.Clear(); 
     foreach (var child in value) 
     { 
      if (child is ICanHasInterface) AddChild(child as ICanHasInterface); 
     } 
    } 
} 

Damit zumindest die Serialisierung funktioniert gut (Anmerkung: Entweder geben Sie XmlInclude Attribute für die Typen, die können in der ursprünglichen Liste sein oder ein Array von Typen im Konstruktor des Serialisierers übergeben), aber wenn das Objekt deserialisiert ist, endet die Children Sammlung leer, weil der set Block während Deserialisierung nie erreicht wird, ich bin ziemlich ratlos, warum dies ist; irgendwelche Ideen?

Antwort

1

Bei der Deserialisierung verwendet der Serializer Ihren Property-Getter, um die Sammlungsinstanz abzurufen, und ruft dann für jedes Element Add() auf. Es ruft Ihren Property Setter nicht auf. Etwas wie folgt aus:

YourClass c = new YourClass(); 
c.ChildrenSerialized.Add(ReadValue()); 
... 

Um die Sammlungen synchronisiert halten Sie die Add() Verhalten der Sammlung, die Sie aus der Eigenschaft Getter zurückkehren anpassen müssten.

Eine bessere Option ist die Änderung der ChildrenSerialized-Eigenschaft, um ein Objekt [] zu verwenden. Bei Arrays liest der Serializer den Wert in ein Array und ruft dann Ihren Property Setter mit dem Wert auf.

+0

Vielen Dank, funktioniert perfekt mit einem Array! –

Verwandte Themen