.net - unir - ¿Qué es un gráfico de objetos y cómo serializo uno?
unir dos graficas en matlab (3)
Un graph objeto general consiste en un conjunto de objetos que contienen referencias 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.
He estado leyendo últimamente sobre 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?
Un gráfico de objetos es un conjunto de objetos que se referencian entre sí.
Serializar un gráfico de objeto es complicado. El serializador debería asignar una ID única a cada objeto y luego reemplazar las referencias con ID únicos.
Si se estaba serializando en formato XML y manejando gráficos de objetos, 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 apoyarlo.
.NET proporciona serialización binaria que trata este problema, así como el problema de las referencias circulares.
Un gráfico de objetos no es un solo objeto, 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 xml es un árbol basado en las propiedades del objeto ... y solo quiere recorrerlo, es decir, con el padre / hijo simple:
- A (sabe que B es su hijo)
- B (sabe que A es su padre)
que serializaría 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 ***
Puedes ver que volvimos a A, entonces ahora estamos en un ciclo sin fin.
XmlSerializer
puede serializar árboles de datos, pero no gráficos completos. Puede marcar propiedades para ignorar, por ejemplo:
[XmlIgnore]
public Node Parent {...}
Y ahora funcionará, pero luego tendremos que arreglar el Parent
.
Por el contrario, algunos otros serializadores pueden manejar gráficos ( DataContractSerializer
puede bajo 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.