Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)

like image 470
Master_T Avatar asked Jan 29 '26 13:01

Master_T


1 Answers

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.

like image 63
Andrey Avatar answered Jan 31 '26 06:01

Andrey



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!