- In .Net/C# Application, I have data structures which have references to each other.
- When I serialize them, .Net Serializes all references with separate object copies.
- In Following Example, I am trying to serialize to Array of ‘Person’
-
A ‘Person’ may have reference to another 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> -
In above code, the same ‘Mike’ object are there on two places, since there are two references for the same object.
- While deserializing, they become two different objects, which is not exact state when they are serialized.
- I want to avoid this and have only copy of object in serialized xml, and all references should refer to this copy. After deserialization , i want to get back, same old data structure.
- Is it Possible ?
In .Net/C# Application, I have data structures which have references to each other. When
Share
It is not possible with XmlSerializer. You could achieve this with DataContractSerializer using the PreserveObjectReferences property. You may take a look at this post which explains the details.
Here’s a sample code:
This produces the following XML:
Now set
PreserveObjectReferencestofalsein the constructor and you will get this:It is worth mentioning that the XML produced this way is not interoperable and can only be deserialized with a DataContractSerializer (same remark as with the BinaryFormatter).