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 / datosSerializació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
| Formato | Ventaja | Uso |
|---|---|---|
| Nodo / texto | Más inspeccionable y flexible | Datos y herramientas |
| Binario | Compacto y rápido | Red y persistencia eficiente |
| Comprimido | Reduce tamaño | Archivos 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.
