2009-05-18 18 views

Respuesta

50

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.

9

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.

5

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.

Cuestiones relacionadas