我正在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,我已经为其他类做了,它可以工作,但它也意味着我必须“手动”读取每个属性/元素,甚至那些我可以用标签轻松自动序列化的那些。
所以,最后,我的问题:是否可以混合这两种方法?即:使用标签自动序列化,然后手动“步入”并手动读取更“棘手”的值? (布尔值只是一个例子,假设我想随意手动读取某些属性)
答案 0 :(得分:1)
您始终可以创建private
类型的XmlIgnore
字段(或使用bool
),然后创建将其显示为True/False
并具有可解析任何内容的setter的属性例如T/F
,True/False
,Y/N
等
对于一般情况,您可以创建enum
。
答案 1 :(得分:0)
如果Andrey的建议不起作用,您可以插入一个文本解析器,在序列化/反序列化操作之前或之后“修复”这些值。
的可能欺骗