使用C#中的私有成员反序列化对象图

时间:2012-04-18 16:34:09

标签: c# xml serialization

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

我发现DataContractSerializer缺乏。它确实可以通过私有setter反序列化为私有字段和属性,但在处理XML输入方面似乎非常脆弱。所需要的只是XML中的元素不是非常正确的顺序而且它失败了。更重要的是它期望数据被声明的顺序不一定与在类声明中声明对象成员的顺序相匹配,这使得无法确定哪些XML可以在没有对象中的数据开始的情况下工作,这样你就可以了可以序列化并检查它的期望。

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

由于目的是为开发期间可能非常简单的应用程序生成测试输入数据,因此我不必采用像Entity或Nhibernate这样的重量级ORM技术。

有简单的解决方案吗?

[更新] @Chuck Savage

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

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

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

1 个答案:

答案 0 :(得分:0)

这样的事情:https://stackoverflow.com/a/10158569/353147

您必须创建自己的样板代码才能来回转换到xml,但附带的扩展名可以最小化。

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

您还可以使用StackOverflow搜索中的user:353147 XElement搜索我的主题答案。

相关问题