Warum benötigt XmlSerializer Typen, die von IEnumerable eine Implementierung von Add (System.Object) erben?

8

Ich benutze die XML-Serialisierung, bin aber jetzt auf einen Laufzeitfehler gestoßen, den ich noch nicht gesehen habe.

  

"Um serialisierbar zu sein, type   Erben von IEnumerable müssen eine haben   Implementierung von Add (System.Object)   auf allen Ebenen ihrer Vererbung   Hierarchie. ImageEditor.EffectOptions   Implementiert Add (System.Object) "

nicht

Es scheint ein wenig seltsam zu sein, eine Methode über eine Laufzeitausnahme zu implementieren, anstatt einen Kompilierzeitfehler wie fehlende Methoden von implementierten Schnittstellen.

Ist das Absicht? Sollte dies nicht über eine Schnittstelle wie XmlSerializable usw. erzwungen werden?

Abgesehen davon frage ich mich, ob der Serializer die Übergabe eines Wertes vom richtigen Typ garantiert, wo ich ihn einfach auf den Typ umwandeln kann, was in meinem Fall EffectOption ist.

Oder sollte ich diese Add (object) -Methode implementieren, um zu sehen, ob das Objekt vom Typ EffectOption ist und wenn keine Ausnahme ausgelöst wird?

Ich habe diese Methode Add (object) noch nicht implementiert, aber ich schätze, es ist sicherer, sie einfach auf EffectOption zu übertragen und sie zu EffectOptions collection hinzuzufügen.

EDIT: Hier ist der Typ selbst:

%Vor%     
Joan Venge 02.03.2011, 20:05
quelle

2 Antworten

3

Weil Unterklassen Interfacemethoden aufgrund der Basisklasse implizit implementieren, aber Xmlserializer Reflektionen verwendet, erhalten Sie den Fehler zur Laufzeit und nicht zur Kompilierzeit.

Versuchen Sie explizit zu implementieren und sehen Sie, was passiert. Ich habe dieses Problem vorher nicht gehabt, also bin ich mir nicht sicher, warum du es bist, außer du machst etwas Brauchbares.

Wenn Ihre Unterklassen die Schnittstelle explizit implementieren, aber keinen Implementierungscode ausführen (die implizite Implementierung von Methoden zulassen), entfernen Sie die Schnittstelle von Ihrer Untertypdeklaration, da sie aufgrund Ihres Basistyps immer noch gültig sein sollte. (jemand sagt mir, wenn ich hier bin)

    
Dustin Davis 02.03.2011 20:06
quelle
2

Ich bin gerade auf dieses Problem gestoßen und habe es durch Hinzufügen einer Add-Methode gelöst:

%Vor%

Ich hoffe, das hilft.

    
Iain Sproat 23.05.2011 19:34
quelle