.netxmlvb.netxml-serialization

Is it possible to do "mixed" XML Serialization in .net?


I'm designing some complex classes in VB.net (but you can write your answer in C# if you prefer :P) that contain data which has to be loaded from XML. The obvious solution is, of course, to design a serializable class, so to automate the loading process.

Now, my problem is as follows: the XML structure is fixed, and I can't change it, and it has some nuisances that make it a pain to serialize. Here is an example of a tiny piece of DTD that explains the problem better:

<!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 -->

As you can see, all the above attributes could be easily serialized by just declaring the corresponding property and decorating it with the <XmlAttribute()> tag. Except for:

IsEnforce (True|False) #REQUIRED

Since True and False are not valid boolean values in xml (due to the capital T and F) and the serialization process will fail.

Now... the only other option that I know is to implement IXMLSerializable by hand, which I have done for other classes, and it works, but it also means I have to read "manually" every attribute/element, even the ones that I could easily serialize automatically with tags.

So, finally, my question: is it possible to MIX the two methods? Ie: serialize automatically with tags and then "step in" manually and read manually the more "tricky" values? (the boolean just an example, suppose I want to manually read certain properties at will)


Solution

  • you can always create private field (or with XmlIgnore) of type bool and then property that will expose it as True/False and have a setter that can parse anything like T/F, True/False, Y/N, etc.

    For generic case you can create enum.