0

我想在C#中反序列化一个对象图,图中的对象会有对象和集合属性,其中一些属性可能是私有的,但我不需要担心循环对象引用。我的意图是在构建应用程序时使用反序列化的对象图作为测试数据,因此需要能够在任何序列化之前从 XML 中反序列化对象。我希望尽可能容易地自由编辑 XML 以改变构造的对象。我希望反序列化过程不需要对象图中每一层的嵌套循环或嵌套 Linq to SQL 语句。

我发现缺少 DataContractSerializer。它确实可以使用私有 setter 反序列化为私有字段和属性,但在处理 XML 输入方面似乎非常脆弱。只需要 XML 中的一个元素的顺序不正确,它就会失败。更重要的是,它希望声明数据的顺序不一定与在类声明中声明对象成员的顺序相匹配,这使得如果没有对象中的数据开始就无法确定 XML 将起作用,以便您可以序列化它并检查它的期望。

XmlSerializer 似乎无法序列化为任何类型的非公共数据。

由于目的是在开发过程中为可能非常简单的应用程序生成测试输入数据,我宁愿不必求助于重量级的 ORM 技术,如 Entity 或 Nhibernate。

有简单的解决方案吗?

[更新] @Chuck Savage

非常感谢您的回复。由于评论字符限制,我在此编辑中做出回应。

在您建议的技术中,反序列化对象层次结构的每一层的逻辑是在每个类中维护的,因此从某种意义上说,您确实将 Linq to SQL 嵌套在涉及的各个类中。该技术还维护了对 XElement 的引用,每个对象都从该引用中获取每个类中的值,因此从这个意义上说,它并没有被反序列化,而只是在 XML 周围创建一个包装器。在我想到的场景中,理想情况下,我希望反序列化应用程序将使用的实际业务对象,因此像这样的 XML 包装器类型对象不能很好地工作,因为与测试使用相比,它需要完全不同的实现。生产使用。

我真正追求的是可以做类似于 XmlSerializer 可以做的事情,但也可以反序列化私有字段(或至少没有设置器的属性)。原因是 XmlSerializer 所做的事情对所涉及类的“正常”生产使用的影响最小(因此对它们的实现没有影响)。

4

1 回答 1

0

像这样的东西怎么样:https ://stackoverflow.com/a/10158569/353147

您将必须创建自己的样板代码来回切换到 xml,但包含的扩展可以最小化。

这是另一个例子:https ://stackoverflow.com/a/9035905/353147

您还可以使用以下方法搜索我关于该主题的答案:user:353147 XElement在 StackOverflow 搜索中。

于 2012-04-18T17:04:35.090 回答