我正在 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(真|假)#REQUIRED
由于 True 和 False 不是 xml 中的有效布尔值(由于大写的 T 和 F),因此序列化过程将失败。
现在...我知道的唯一其他选择是手动实现 IXMLSerialized,我已经为其他类实现了这一点,并且它有效,但这也意味着我必须“手动”读取每个属性/元素,甚至是那些属性/元素我可以轻松地使用标签自动序列化。
最后,我的问题是:是否可以混合使用这两种方法?即:使用标签自动序列化,然后手动“介入”并手动读取更“棘手”的值? (布尔值只是一个例子,假设我想随意手动读取某些属性)
您始终可以创建
private
类型的 XmlIgnore
字段(或使用 bool
),然后创建将其公开为 True/False
的属性,并拥有一个可以解析 T/F
、True/False
、 等内容的 setter Y/N
等
对于一般情况,您可以创建
enum
。
如果 Andrey 的建议不起作用,您可以插入一个文本解析器来“修复”序列化/反序列化操作之前或之后的值。