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)