3 Stimmen

Ist es möglich, "gemischte" XML-Serialisierung in .net zu tun?

Ich entwerfe einige komplexe Klassen in VB.net (aber Sie können Ihre Antwort in C# schreiben, wenn Sie es vorziehen :P), die Daten enthalten, die aus XML geladen werden müssen. Die offensichtliche Lösung ist natürlich, eine serialisierbare Klasse zu entwerfen, um den Ladeprozess zu automatisieren.

Nun, mein Problem ist wie folgt: die XML-Struktur ist fest, und ich kann es nicht ändern, und es hat einige Ärgernisse, die es ein Schmerz zu serialisieren machen. Hier ist ein Beispiel für ein kleines Stück DTD, das das Problem besser erklärt:

<!ELEMENT Relationship ( AttributePairs | AscendCaption | DescendCaption | ErrPreventInsertOrUpdateChild | ErrPreventDeleteParent | ErrPreventUpdateParent |ExtendedProperties |HiddenProperties )* >
<!ATTLIST Relationship 

    CountAggregates CDATA #IMPLIED
    CountReplicates CDATA #IMPLIED
    OnParentUpdate (PreventIfChildren|UpdateChildren) #IMPLIED
    OnParentDelete (PreventIfChildren|DeleteChildren|NullChildrenForeignKey) #IMPLIED
    IsEnforce (True|False) #REQUIRED 
    OnChildInsertOrUpdate (PreventIfNoParent|InsertParentIfNone) #IMPLIED
    ChildRoleName CDATA #IMPLIED
    ParentRoleName CDATA #IMPLIED
    ParentAttributeGroupInstance CDATA #IMPLIED
    ChildAttributeGroupInstance CDATA #IMPLIED

>

<!--Lots of other sutff not needed for this example -->

Wie Sie sehen können, können alle oben genannten Attribute leicht serialisiert werden, indem Sie einfach die entsprechende Eigenschaft deklarieren und sie mit der <XmlAttribute()> Tag. Außer bei:

IsEnforce (True|False) #REQUIRED

Da True und False keine gültigen booleschen Werte in Xml sind (wegen des großen T und F), schlägt der Serialisierungsprozess fehl.

Nun... die einzige andere Option, die ich kenne, ist IXMLSerializable von Hand zu implementieren, die ich für andere Klassen getan habe, und es funktioniert, aber es bedeutet auch, dass ich "manuell" jedes Attribut/Element zu lesen, auch diejenigen, die ich leicht automatisch mit Tags serialisieren könnte.

Nun zu meiner Frage: Ist es möglich, die beiden Methoden zu mischen? D.h.: automatisch mit Tags serialisieren und dann manuell "eingreifen" und die "heikleren" Werte manuell lesen? (der boolesche Wert ist nur ein Beispiel; nehmen wir an, ich möchte bestimmte Eigenschaften nach Belieben manuell auslesen)

1voto

Andrey Punkte 57704

Können Sie jederzeit erstellen private Feld (oder mit XmlIgnore ) des Typs bool und dann eine Eigenschaft, die sie als True/False und haben einen Setter, der alles analysieren kann wie T/F , True/False , Y/N , usw.

Für den generischen Fall können Sie Folgendes erstellen enum .

0voto

StingyJack Punkte 18514

Wenn der Vorschlag von Andrey nicht funktioniert, könnten Sie einen Textparser einfügen, der die Werte vor oder nach der Serialisierungs-/Deserialisierungsoperation "korrigiert".

Mögliches Duplikat von XmlSerializer und OnSerializing/OnSerialized Alternativen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X