He estado leyendo últimamente sobre la serialización. He leído que cuando uso XmlSerialization no puedo serializar gráficos de objetos. ¿Qué es un gráfico de objetos y por qué no puedo serializarlo simplemente?¿Qué es un gráfico de objetos y cómo serializo uno?
Respuesta
Un gráfico de objetos no es un objeto único, sino más bien un conjunto de objetos relacionados. Para un ejemplo simple, considere:
public class Node {
public string Name {...}
public Node Parent {...}
public List<Node> Children {...}
}
donde cada niño sabe sobre el padre (y el padre sabe sobre el niño).
El problema es que es un árbol XML basado en las propiedades del objeto ... y quiere caminar solo ellos - es decir, con la simple padre/hijo:
- A (B sabe que es su hijo)
- B (sabe que A es su matriz)
que serializar como:
<Node>
<Name>A</Name>
<!-- no Parent as A is the top node, so null -->
<Children>
<Node>
<Name>B</Name>
<Parent>
<Node>
<Name>A</Name>
*** boom ***
Puede ver que volvimos a A, por lo que ahora estamos en un ciclo sin fin.
XmlSerializer
pueden serializar árboles de datos, pero no los gráficos completos. Puede marcar las propiedades a ser ignorados, por ejemplo:
[XmlIgnore]
public Node Parent {...}
Y ahora que va a trabajar, pero vamos a tener que fijar el Parent
después.
Por el contrario, algunos otros serializadores pueden manejar gráficos (DataContractSerializer
pueden según demanda). Lo hace mediante el seguimiento de objetos en una clave única, pero luego el resultado no es el que espera de un xml regular.
Un gráfico de objetos es un conjunto de objetos que se referencian entre sí.
Serializar un gráfico de objetos es complicado. El serializador debería asignar una ID única a cada objeto y luego reemplazar las referencias con ID únicos.
Si estaba serializando en formato XML y manejando gráficos de objeto, tendría que agregar un atributo "OBJECT_ID" (u otro nombre) a cada elemento. Esto sería muy fácil de romper: ¿qué pasaría si agregas una propiedad con el mismo nombre a la clase que estás serializando?
La solución más simple es no admitirlo.
.NET proporciona una serialización binaria que trata este problema, así como el problema de las referencias circulares.
Un objeto general graph consiste en un conjunto de referencias de objetos entre sí. Si tiene un árbol de objetos donde no hay enlaces hacia atrás, la serialización y deserialización es simple. Con un gráfico general, el proceso de (de) serialización necesita realizar un seguimiento de la identidad de cada objeto, y utilizar algún tipo de algoritmo de marca y barrido para garantizar que los objetos no se (de) serializar dos veces.
- 1. ¿Qué es un árbol de vocabulario y cómo construir uno?
- 2. ¿Cómo serializo un objeto en un XDocument?
- 3. ¿Cómo serializo una matriz de objetos jQuery para JSON Post?
- 4. serialización de Java, Kryo y el gráfico de objetos
- 5. ¿Cómo serializo un objeto simple en sdk de iPhone?
- 6. ¿Cómo serializo JSON un diccionario de Python?
- 7. ¿Qué es un dispositivo gráfico nulo?
- 8. Encontrar un ciclo en un gráfico no dirigido versus encontrar uno en un gráfico dirigido
- 9. Entity Framework - Separar y mantener el gráfico de objetos relacionados
- 10. Cómo ordenar un NSMutableArray de Objetos gestionados a través de un gráfico de objetos
- 11. Cambiar un gráfico de barras horizontales a uno vertical
- 12. NHibernate Future gráfico de objetos muchas consultas
- 13. Diferencia entre gráfico, gráfico y gráfico
- 14. ¿Cómo de/de serializo JSON en WinRT?
- 15. ¿Cómo serializo un valor enum como un int?
- 16. ¿Cómo creo un gráfico cíclico de objetos inmutables en Perl y Moose?
- 17. Inicializadores de objetos y colecciones: ¿se asigna uno mismo?
- 18. Anotaciones de datos: validando recursivamente un gráfico completo de objetos
- 19. ¿Cómo serializo un objeto y lo guardo en un archivo en Android?
- 20. Combinación de dos objetos JSON en uno
- 21. HttpWebRequest un proxy y uno no
- 22. ¿Qué es un algoritmo rápido y estable para una ruta aleatoria en un gráfico de nodo?
- 23. ¿Cómo serializo un objeto System.Windows.Media.Color en una cadena sRGB?
- 24. ¿Cómo visualizar un gráfico de estructuras C que contienen/apuntan el uno al otro?
- 25. ¿Cómo serializo un tipo anónimo C# en una cadena JSON?
- 26. SAXException2: Se detecta un ciclo en el gráfico de objetos. ¿Cuál es el caso?
- 27. Buscando un gráfico de objetos tree-view control for WPF
- 28. ¿Por qué ItemCollection.Groups es colección de Objetos y no CollectionViewGroups?
- 29. ¿Por qué la gente habla sobre marcos DI "instanciando un gráfico de objetos" en lugar de "crear instancias de objetos"?
- 30. ¿Qué es un marco de mapeo relacional de objetos?