logo
ReferenciaAPI

Nodo

Estructura jerárquica de datos utilizada por Eco para estado, configuración y serialización.

Nodo

Nodo es la estructura jerárquica de datos que Eco utiliza para representar información estructurada sin depender de una clase concreta de gameplay.

Su modelo es sencillo: un nodo tiene un nombre, un valor opcional y una colección de nodos hijos.

Nodo
├── Nombre
├── Valor
└── Hijos
    ├── Perfil
    │   ├── Nivel
    │   └── Clase
    └── Estado
        └── Vida

Nodo no es un diccionario plano

Los datos pueden organizarse por rutas jerárquicas como Perfil/Nivel o Estado/Vida. Esto permite representar estructuras complejas y serializarlas como una única entidad.

Crear un nodo

var datos = new Nodo("Perfil");
datos.SetChild("Nivel", 25);
datos.SetChild("Clase", "Caballero");

También puedes asignar directamente un valor:

var nivel = new Nodo("Nivel", 25);
int valor = nivel.Get<int>();

Rutas jerárquicas

Eco permite leer y escribir usando rutas separadas por /:

datos.SetHierarchy("Perfil/Nivel", 25);
datos.SetHierarchy("Perfil/Clase", "Caballero");

int nivel = datos.GetHierarchy<int>("Perfil/Nivel", 1);

Esto hace que Nodo sea especialmente útil para datos de servidor, canal, jugador y objeto.

Añadir y reemplazar hijos

datos.AddChild("Nivel", 25);
datos.AddMissingChild("Clase", "Caballero");
datos.ReplaceChild(new Nodo("Nivel", 30));
datos.UpdateChild("Nivel", 31, true);

La diferencia importante es si quieres añadir siempre, añadir sólo cuando falta o reemplazar el valor existente.

Lectura tipada

int nivel = datos.GetHierarchy<int>("Perfil/Nivel", 1);
float velocidad = datos.GetHierarchy<float>("Estadisticas/Velocidad", 5f);

Nodo utiliza Serializacion.Convert cuando el valor almacenado no coincide exactamente con el tipo solicitado.

Caché de búsquedas

Las búsquedas de hijos pueden utilizar una caché interna cuando un nodo contiene suficientes hijos. Si manipulas manualmente la colección children, debes invalidarla:

datos.MarkChildrenAsChanged();

Normalmente no necesitas hacerlo cuando utilizas AddChild, SetChild o los métodos de alto nivel.

Serialización

Nodo puede representarse en texto, binario o comprimido. La capacidad está integrada con las herramientas de serialización de Eco y se utiliza para persistencia y transmisión de estructuras de datos.

Nodo

Serializacion
 ├── Texto
 ├── Binario
 └── Comprimido

Implementar serialización propia

Una clase puede implementar IDataNodeSerializable para controlar cómo se representa en Nodo:

public class DatosUnidad : IDataNodeSerializable
{
    public int nivel;
    public string clase;

    public void Serialize(Nodo node)
    {
        node.SetChild("Nivel", nivel);
        node.SetChild("Clase", clase);
    }

    public void Deserialize(Nodo node)
    {
        nivel = node.GetHierarchy<int>("Nivel", 1);
        clase = node.GetHierarchy<string>("Clase", "Desconocida");
    }
}

Cuándo utilizarlo

Nodo es apropiado para:

  • datos persistentes;
  • configuración de canales;
  • datos del jugador;
  • estado de objetos;
  • serialización de estructuras complejas;
  • almacenamiento que deba sobrevivir a cambios de versión.

Para una acción puntual no necesitas construir manualmente un Nodo si los parámetros de la RFC ya son serializables.

Errores habituales

No abuses de rutas de texto

Las rutas son cómodas, pero en código de alta frecuencia conviene evitar reconstruir árboles innecesariamente. Mantén referencias a nodos cuando una estructura se consulta continuamente.

Código fuente

Nodo.cs

Implementación actual de la estructura jerárquica.

Serialización

Conversión entre tipos de C# y representaciones de Eco.

On this page