当我在我的存储库中使用XmlSerializer时,它会输出冗余数据,因为它序列化List< Student>中每个学生的所有属性.然后再次对List< Enrollment>中的那些相同学生的每次引用.我正在寻找一种优雅的方法来解决这个问题.
反序列化后,我可以使用反序列化创建的重复对象实例中的ID值来修复引用,但这似乎是hackish.
修复冗余输出的一种方法是XmlIgnore Enrolment.Student和Enrolment.Course,并为序列化创建另外两个属性–Inrolment.StudentID和Enrolment.CourseID.但是,在反序列化期间,由于List< Student>的反序列化结果,无法设置Enrolment.Student和Enrolment.Course的引用(AFAIK).和列表<课程>不可用.
我想到的另一种方法是在我的对象层次结构中向下排序,分别执行每个列表并控制反序列化的顺序 – 我宁愿不这样做.
另一种方法是XmlIgnore List< Enrollment>并创建一个注册序列化助手类,初始化List< Enrollment>在反序列化完成之后.这似乎付出了很多努力.
其他人如何使用XmlSerializer序列化/反序列化对同一对象的多个引用?
从来没有一个通用的解决方案,我想这就是为什么MS剥离了Silverlight框架.
我从不依赖.net框架的任何自动序列化机制.对于我自己的模型和存储库,我通常知道或者可以很容易地以编程方式确定哪些属性是简单的标量(数字/字符串/等),哪些属性是其他对象的链接(以及哪些是其中的列表).
基本上有两种情况:
1:我们只想序列化/传输对象的平面信息.在这种情况下,我只传输链接到其他对象的属性的相应ID.接收者然后可以进行后续查询以获得他们需要的所有其他对象.
2:我们希望尽可能多地传输信息,即具有多个级别的更深层次的嵌套XML,主要用于某些报告功能,仅使用XML上的一些CSS直接显示所有内容.在这种情况下,实际上希望将相同的对象多次解析到XML树中.
有时我需要稍微调整第一个场景以避免过多的后续查询调用,但通常我相处得很好.即我已经内置到我们的代码库中,我们可以指定在何时和/或在某处配置我们想要解析的其他对象.