.NET XmlSerializer和对同一对象的多个引用

Luk*_*hde 8 .net xml xml-serialization object-reference

我的存储库有List<Student>,List<Course>并且List<Enrolment>注册有Enrolment.Student和Enrolment.Course,它们是前两个列表中的学生或课程之一.

当我在我的存储库中使用XmlSerializer时,它会输出冗余数据,因为它会对每个学生的所有属性进行序列化,List<Student>然后再对每个对这些学生的参考进行序列化List<Enrolment>.我正在寻找一种优雅的方法来解决这个问题.

反序列化后,我可以使用反序列化创建的重复对象实例中的ID值来修复引用,但这似乎是hackish.

修复冗余输出的一种方法是XmlIgnore Enrolment.Student和Enrolment.Course,并为序列化创建另外两个属性 - Enrolment.StudentID和Enrolment.CourseID.但是,在反序列化期间,由于反序列化的结果List<Student>List<Course>不可用,因此无法设置Enrolment.Student和Enrolment.Course的引用(AFAIK).

我想到的另一种方法是在我的对象层次结构中向下排序,分别执行每个列表并控制反序列化的顺序 - 我宁愿不这样做.

另一种方法是XmlIgnore List<Enrolment>并创建一个注册序列化助手类,List<Enrolment>在其自身的反序列化完成后进行初始化.这似乎付出了很多努力.

其他人如何使用XmlSerializer序列化/反序列化对同一对象的多个引用?

her*_*ter 3

哦,序列化的痛苦:-> ...

从来没有一个通用的解决方案可以解决这个问题,我想这就是微软将其从 Silverlight 框架中剥离出来的原因。

我从不依赖 .net 框架的任何自动序列化机制。对于我自己的模型和存储库,我通常知道或可以轻松地以编程方式确定哪些属性是简单的标量属性(数字/字符串/等),哪些属性是到其他对象的链接(以及哪些是两者的列表)。

基本上有两种情况:

1:我们只想序列化/传输对象的平面信息。在这种情况下,我仅传输链接到其他对象的属性的相应 ID。然后接收者可以进行后续查询以获取他们需要的所有其他对象。

2:我们希望传输尽可能多的信息,即具有多个级别的更深层次的嵌套 XML,主要用于某些仅使用 XML 上的 CSS 直接显示所有内容的报告功能。在这种情况下,实际上需要将相同的对象多次解析到 XML 树中。

有时我需要稍微调整第一个场景,以避免过多的后续查询调用,但通常我相处得很好。即,我已将其内置到我们的代码库中,我们可以指定何时要解析哪些附加对象,和/或在某处配置它。