logo
ReferenciaAPI

Serialización

Conversión de tipos de C# a las representaciones binarias y jerárquicas utilizadas por Eco.

Serialización

Serializacion contiene los conversores y extensiones que permiten representar tipos de C# en datos que Eco puede enviar o guardar.

Hay dos caminos principales:

                Serialización
                 /         \
                /           \
           Binaria          Nodo
              │                │
        RFC / Paquetes    Persistencia / datos

Serialización binaria

IBinarySerializable permite controlar manualmente cómo una clase se escribe en un BinaryWriter y se reconstruye desde un BinaryReader.

public class EstadoUnidad : IBinarySerializable
{
    public int vida;
    public Vector3 posicion;

    public void Serialize(BinaryWriter writer)
    {
        writer.Write(vida);
        writer.Write(posicion);
    }

    public void Deserialize(BinaryReader reader)
    {
        vida = reader.ReadInt32();
        posicion = reader.Read<Vector3>();
    }
}

El objetivo habitual es reducir tamaño y coste frente a serializar automáticamente todos los campos de una clase.

Serialización con Nodo

IDataNodeSerializable está orientado a representaciones jerárquicas:

public void Serialize(Nodo node)
{
    node.SetChild("Vida", vida);
    node.SetChild("Posicion", posicion);
}

Se utiliza especialmente cuando los datos deben ser legibles, versionables o persistirse en una estructura jerárquica.

Conversión de tipos

Serializacion.Convert permite adaptar valores cuando el dato almacenado no coincide exactamente con el tipo solicitado por el consumidor.

int vida = Serializacion.Convert(valor, 100);

Esto también se utiliza internamente por Nodo.Get<T>() y Nodo.GetHierarchy<T>().

Tipos conocidos

La implementación contiene soporte explícito para numerosos tipos básicos y estructuras de Unity, además de Vector2D, Vector3D, arrays, listas y Nodo.

No debes asumir que cualquier objeto arbitrario es serializable de la misma forma: las clases complejas se benefician de implementar interfaces propias o de utilizar datos simples.

Compatibilidad de versiones

Cuando un dato persistente pueda sobrevivir a actualizaciones del juego, evita depender de detalles frágiles de nombres de tipos internos. Prefiere estructuras de Nodo con rutas estables y valores versionables.

Datos persistentes

La serialización es parte del contrato de los datos. Cambiar un nombre, tipo o estructura puede hacer incompatibles partidas o mensajes existentes.

Texto frente a binario

FormatoVentajaUso
Nodo / textoMás inspeccionable y flexibleDatos y herramientas
BinarioCompacto y rápidoRed y persistencia eficiente
ComprimidoReduce tamañoArchivos grandes

TypeToName y NameToType

Eco mantiene una representación textual estable para distintos tipos:

string nombre = Serializacion.TypeToName(typeof(Vector3));
Type tipo = Serializacion.NameToType(nombre);

Esto es relevante cuando la representación necesita sobrevivir fuera de la instancia de C# que la creó.

Cuándo crear un serializer propio

Implementa serialización propia cuando:

  • el objeto se transmite con mucha frecuencia;
  • el objeto contiene datos que pueden compactarse considerablemente;
  • necesitas controlar compatibilidad entre versiones;
  • necesitas evitar reflexión en una ruta crítica.

No la añadas sólo por reutilizar una clase una vez: el serializer también se convierte en una responsabilidad de mantenimiento.

Nodo

Estructura jerárquica utilizada para datos.

Buffer

Contenedor binario de bajo nivel.

Serializacion.cs

Implementación de la serialización actual.

On this page