是否有可能在.net中进行“混合”XML序列化?

时间:2010-11-09 20:57:54

标签: .net xml vb.net xml-serialization

我正在VB.net中设计一些复杂的类(但你可以在C#中编写你的答案,如果你愿意:P),它们包含必须从XML加载的数据。当然,显而易见的解决方案是设计一个可序列化的类,以便自动化加载过程。

现在,我的问题如下:XML结构是固定的,我无法改变它,并且它有一些麻烦,使序列化的痛苦。以下是一小段DTD的示例,可以更好地解释问题:

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

如您所见,通过声明相应的属性并使用<XmlAttribute()>标记对其进行装饰,可以轻松地序列化所有上述属性。 除了:

IsEnforce(True | False)#REQUIRED

由于True和False在xml中不是有效的布尔值(由于大写字母T和F),序列化过程将失败。

现在......我知道的唯一另一个选择是手动实现IXMLSerializable,我已经为其他类做了,它可以工作,但它也意味着我必须“手动”读取每个属性/元素,甚至那些我可以用标签轻松自动序列化的那些。

所以,最后,我的问题:是否可以混合这两种方法?即:使用标签自动序列化,然后手动“步入”并手动读取更“棘手”的值? (布尔值只是一个例子,假设我想随意手动读取某些属性)

2 个答案:

答案 0 :(得分:1)

您始终可以创建private类型的XmlIgnore字段(或使用bool),然后创建将其显示为True/False并具有可解析任何内容的setter的属性例如T/FTrue/FalseY/N

对于一般情况,您可以创建enum

答案 1 :(得分:0)

如果Andrey的建议不起作用,您可以插入一个文本解析器,在序列化/反序列化操作之前或之后“修复”这些值。

XmlSerializer and OnSerializing/OnSerialized alternatives

的可能欺骗