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

问题描述 投票:0回答:2

我正在 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,我已经为其他类实现了这一点,并且它有效,但这也意味着我必须“手动”读取每个属性/元素,甚至是那些属性/元素我可以轻松地使用标签自动序列化。

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

.net xml vb.net xml-serialization
2个回答
1
投票

您始终可以创建

private
类型的
XmlIgnore
字段(或使用
bool
),然后创建将其公开为
True/False
的属性,并拥有一个可以解析
T/F
True/False
 等内容的 setter Y/N

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

enum


0
投票

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

可能是 XmlSerializer 和 OnSerializing/OnSerialized 替代品的欺骗

© www.soinside.com 2019 - 2024. All rights reserved.