2010-03-23 1 views
11

Ich habe eine Basisklasse mit einer Eigenschaft namens Name, die ein XmlText-Attribut hat.XmlText Attribut in der Basisklasse bricht Serialisierung

Wenn eine vererbte Klasse serialisiert ich eine Ausnahme erhalten sagen:

Es ist ein Fehler aufgetreten Typ reflektierende ‚[Typname]‘. ---> System.InvalidOperationException: Objekt vom Typ '[Typ Name]' kann nicht serialisiert werden. Basistyp '[Basistypname]' hat simpleContent und kann nur erweitert werden, indem XmlAttribute Elemente hinzugefügt werden. Bitte beachten Sie, dass Sie das Element XmlText der Basisklasse in string array ändern müssen.

Hier sind meine Klassendefinitionen, der Fehler tritt beim Serialisieren in XML auf.

[Serializable] 
public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 
} 

[Serializable] 
public class Vendor : LookupItem 
{ 
    public string ContactNumber { get; set; } 
} 

[Serializable] 
public class Vendors : List<Vendor> 
{ 

} 

Antwort

15

Es scheint zu passieren, weil die LookupItem Klasse kein untergeordnetes Element in seiner XML-Darstellung hat. Aus diesem Grund betrachtet XmlSerializer es als XML-Element. Wenn Sie eine neue Eigenschaft zu LookupItem hinzufügen, die als XML-Element serialisiert werden soll, funktioniert es einwandfrei.

Ich habe nur ein paar Minuten bei der verfügbaren XML-Suche Serialisierung Attribute, aber ich konnte keine finden, die angeben, erlauben würden, dass der Typ nicht ein simpleContent Element ist ...

Also ich denke, man könnte Lassen Sie es funktionieren, indem Sie eine Dummy-Eigenschaft oder ein Dummy-Feld hinzufügen, die Sie nie in der Klasse LookupItem verwenden. Wenn Sie ihm nie einen Wert zuweisen, bleibt er null und wird nicht serialisiert, aber er verhindert, dass Ihre Klasse als simpleContent behandelt wird. Ich weiß, es ist ein schmutziges Problem zu umgehen, aber ich sehe keine andere einfache Art und Weise ...

public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 

    public object _dummy; 
} 

(BTW, beachten Sie, dass das Serializable Attribut für die XML-Serialisierung nicht erforderlich ist.)

Wie auch immer, tun Sie wirklich brauchen Name als XML-Text zu serialisieren? Das ist ziemlich ungewöhnlich, normalerweise haben XML-Elemente entweder einen einfachen Inhalt (Text) oder untergeordnete Elemente ... Eine Mischung aus beidem macht das XML schwerer lesbar. Wenn Sie nicht dazu gezwungen werden, empfehle ich Ihnen, Name als Attribut oder zu serialisieren Kindelement.