Serialización / Derialización de una estructura de árbol

Estoy tratando de encontrar la mejor manera de guardar (serializar) y luego abrir (deserializar) una estructura de árbol. Mi estructura está compuesta por varios tipos de objetos con diferentes propiedades, pero cada uno hereda de una clase abstracta abstracta "Nodo".

Cada nodo tiene un ID único (GUID) y un método AddSuperNode (Node nd) que establecerá el elemento primario de un nodo. Esto a su vez llama a otros métodos que permiten que el nodo primario sepa qué subnodos tiene. Sin embargo, algunos nodos también utilizan unaAddAuxSuperNode () método que agrega un padre secundario al Nodo.

Estaba usando la serialización binaria, pero ahora creo que quiero usar algo donde tengo un poco más de control, y los datos serializados son más accesibles. También quiero retener la información de Tipo cuando deserializo y ser capaz de serializar valores privados. Asi que DataContractSerializer parecía el mejor camino a seguir.

No puedo simplemente serializar la raízNod directamente porque los nodos tienen varios padres. No quiero crear objetos duplicados. Entonces parece que necesito deconstruir el árbol en una lista plana, y luego serializar eso. Luego, después de serializar esa lista, reconstruya el árbol. ¿Suena bien?

Como dije antes de cadaNod tiene un identificador GUID único, pero ahora los nodos hacen referencia a sus padres / hijos directamente y no almacenan sus identificadores. Podría actualizar laAddSuperNode () yAddAuxSuperNode () métodos para actualizar también una lista de identificadores principales para ser serializados además de las referencias directas. Pero prefiero solo actualizar / crear esta lista cuando el objeto se está serializando. Entonces estaba pensando crear unaUpdateSuperNodeIDRefs () método en el nodo que se llamaría justo antes de la serialización.

Lo siguiente es lo que planeo hacer para la serialización y deserialización de esta estructura. ¿Alguien puede sugerir una forma mejor / más limpia / más eficiente de hacer esto?

Publicación por entrega

1) Proporcione el nodo raíz de la estructura de árbol

2) Descomponer la estructura de árbol en un planoDictionary (Id. De guid, nodo nd) dóndecarné de identida es el guid deDakota del Nort.

3) Llamar aUpdateSuperNodeIDRefs (); para que cada nodo actualice las ID que ha guardado para sus padres.

4) Serializar laDiccionari de nodos con DataContractSerializer

Deserialización

1) Deserializar laDiccionari de nodos

2) Itterate a través de cadaNod en elDiccionari, reconectando cada uno con sus padres. Para cualquier ID de padre almacenado, busque la respectivaNod (s) en elDiccionari con ID (s) coincidentes, llame alAddSuperNode () oAddAuxSuperNode () para volver a conectar el nodo a su padre (s)

3) De cualquierNod en el Diccionario encuentre la raíz de la estructura

4) Devuelve la raízNod

Respuestas a la pregunta(1)

Su respuesta a la pregunta