【发布时间】:2010-12-09 16:56:41
【问题描述】:
- 在 .Net/C# 应用程序中,我有相互引用的数据结构。
- 当我对它们进行序列化时,.Net 使用单独的对象副本对所有引用进行序列化。
- 在以下示例中,我尝试序列化为“Person”数组
-
“人”可能指代另一个人。
public class Person { public string Name; public Person Friend; } Person p1 = new Person(); p1.Name = "John"; Person p2 = new Person(); p2.Name = "Mike"; p1.Friend = p2; Person[] group = new Person[] { p1, p2 }; XmlSerializer ser = new XmlSerializer(typeof(Person[])); using (TextWriter tw = new StreamWriter("test.xml")) ser.Serialize(tw,group ); //above code generates following xml <ArrayOfPerson> <Person> <Name>John</Name> <Friend> <Name>Mike</Name> </Friend> </Person> <Person> <Name>Mike</Name> </Person> </ArrayOfPerson> 在上面的代码中,同一个“Mike”对象存在于两个地方,因为同一个对象有两个引用。
- 在反序列化时,它们变成了两个不同的对象,这不是它们被序列化时的确切状态。
- 我想避免这种情况,并且只有序列化 xml 中的对象副本,并且所有引用都应引用此副本。反序列化后,我想返回相同的旧数据结构。
- 有可能吗?
【问题讨论】:
-
刚刚发现 BinaryFormatter 和 SoapFormatter 保留了参考值。
-
SoapFormatter 已被弃用,它不支持泛型。
标签: c# .net xml xml-serialization