XML Serialización XML – Almacenamiento de referencia en lugar de copia de objeto

No es posible con XmlSerializer . Puede lograr esto con DataContractSerializer utilizando la propiedad PreserveObjectReferences . Puede echar un vistazo a esta publicación que explica los detalles.

Aquí hay un código de muestra:

 public class Person { public string Name; public Person Friend; } class Program { static void Main(string[] args) { Person p1 = new Person(); p1.Name = "John"; Person p2 = new Person(); p2.Name = "Mike"; p1.Friend = p2; Person[] group = new Person[] { p1, p2 }; var serializer = new DataContractSerializer(group.GetType(), null, 0x7FFF /*maxItemsInObjectGraph*/, false /*ignoreExtensionDataObject*/, true /*preserveObjectReferences : this is where the magic happens */, null /*dataContractSurrogate*/); serializer.WriteObject(Console.OpenStandardOutput(), group); } } 

Esto produce el siguiente XML:

     Mike  John    

Ahora establece PreserveObjectReferences en false en el constructor y obtendrás esto:

     Mike  John    Mike   

Vale la pena mencionar que el XML producido de esta manera no es interoperable y solo se puede deserializar con un DataContractSerializer (el mismo comentario que con BinaryFormatter ).

Puede usar ExtendedXmlSerializer. Aquí hay un ejemplo de referencia de objeto de serialización y referencia circular

Si tienes una clase:

 public class Person { public int Id { get; set; } public string Name { get; set; } public Person Boss { get; set; } } public class Company { public List Employees { get; set; } } 

luego creas un objeto con referencia circular, como este:

 var boss = new Person {Id = 1, Name = "John"}; boss.Boss = boss; //himself boss var worker = new Person {Id = 2, Name = "Oliver"}; worker.Boss = boss; var obj = new Company { Employees = new List { worker, boss } }; 

Debe configurar la clase Person como objeto de referencia:

 var serializer = new ConfigurationContainer().ConfigureType() .EnableReferences(p => p.Id) .Create(); 

Al final puedes serializar tu objeto:

 var xml = serializer.Serialize(obj); 

El resultado xml se verá así:

 < ?xml version="1.0" encoding="utf-8"?>   4  Oliver  John       

ExtendedXmlSerializer admite .net 4.5 y .net Core.