Steuerung der Serialisierung von abgeleiteten Typ
Gegeben, ein Typ wie:
public class FooList : List<Foo>
{
public string SomeMessage { get; set; }
}
Wie bekomme ich die SomeMessage
- Eigenschaft serialisiert werden zusammen mit der Sammlung ohne übergeordneten Serialisierung selbst?
Was ich bekommen, ist:
<FooList>
<Foo />
<Foo />
<Foo />
</FooList>
und was ich will, ist:
<FooList>
<SomeMessage />
<Foo />
<Foo />
<Foo />
</FooList>
Aus welchem Grund auch immer, (ich denke, es ist, weil die Serialisierung verwendet wird, der für die generische Liste nicht sieht, dass die neue Eigenschaft) es ist nicht geschrieben wird.
Falls es eine Rolle spielt, hier ist was ich benutze, um es zu serialisieren.
FooList content = new FooList();
content.SomeMessage="this is a test";
//add foos
using (TextWriter writer = new StreamWriter("C:\\foos.xml"))
{
XmlSerializer serializer = new XmlSerializer(typeof(FooList));
serializer.Serialize(writer, content);
}
- möglich, Duplikat der C# Xml-Serialisierung von List<T> Nachkomme mit Xml-Attribut
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die
XmlSerializer
serialisiert einer Sammlung, es sind nur die Elemente der Sammlung in Betracht. Jede zusätzliche Eigenschaft in der Klasse deklariert ist, wird ignoriert. Sie müssen entweder zu implementierenIXmlSerializable
Ihre eigenen Serialisierung Logik, oder ändern Sie das design Ihrer Klasse.Könnte man so etwas machen:
Wenn Sie implementieren müssen, um die
XmlChoiceIdentifierAttribute
XmlSerializer wird in der Lage sein, um Ihre Anforderungen richtig.Mehr info zu dem Thema hier:
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlchoiceidentifierattribute.aspx
Beispielcode:
Wenn Sie es vorziehen, zu generieren, die serialisierbare Klasse über
xsd.exe
, dann die xsd-schema sollte wie folgt Aussehen (beachten Sie diexs:choice
tag):HTH...
Wenn sich aus einer collection-Klasse der
XmlSeralizier
nur serialisieren der Elemente in der Auflistung. Eine Möglichkeit, dies zu umgehen, ist das erstellen einer Klasse, die umschließt die Sammlung undSomeMessage
haben und dass serialisiert.Dann könnte man zu dieser:
Eine ausführliche Diskussion zur Verfügung hier.
Versuchen Dekoration SomeMessage mit einem [XMLElement] - Attribut, um zu erzwingen, die die XMLSerializer-gehören.