Implementación de serialización compacta dinámica
NCache almacena los datos de la aplicación en forma serializada: se serializa en el cliente de caché antes de agregarse a la caché. Por lo tanto, los datos que agregue al caché también deben marcarse como serializables. Admite serialización binaria nativa y serialización JSON para NCache clientes y también tiene su propio marco de serialización llamado serialización compacta (que es rápida y compacta en comparación con la serialización nativa). En la serialización nativa de Java, se serializan todos los datos de un objeto junto con todo tipo de información. De esta forma, el tamaño del objeto aumenta, mientras que en la serialización compacta, todo el tipo de información no viaja por la red y el tamaño del objeto en la red se reduce. A medida que disminuye el tamaño del objeto, los viajes a la red se vuelven más rápidos y, eventualmente, el costo disminuye, aumentando así el rendimiento general de la aplicación.
La serialización compacta también es una serialización binaria que tiene los siguientes beneficios:
Tamaño de datos compacto
In NCache datos binarios, el tamaño del objeto serializado es compacto. En determinados escenarios, el tamaño de los datos puede ser 10 veces menor que el de la serialización nativa. Los objetos serializados más pequeños tardan menos en viajar por la red, lo que da como resultado un mayor rendimiento. Esto también ayuda a reducir el consumo de memoria en el servidor de caché. De esta forma, NCache logra un mejor rendimiento, reduciendo tiempo y costos. El pequeño tamaño de los objetos y el rápido tráfico de red aumentan el rendimiento de la aplicación.
Más rápido que la serialización nativa
La serialización compacta es más rápida que la serialización nativa, ya que no depende tanto de la reflexión como la serialización nativa. La serialización nativa utiliza la reflexión para la información de atributos. Esta reflexión se evita en NCacheSerialización compacta. La información de tipo para tipos compactos se carga solo una vez cuando se inicializa el caché, lo que reduce la sobrecarga que enfrenta el uso de la serialización nativa. Los puntos de referencia han demostrado que, en ciertos casos usados, es entre 5 y 10 veces más rápido que la serialización nativa.
Sin cambio de código
No se requiere ningún cambio de código para que una clase compacta sea serializable. El único paso requerido es configurar tus clases a través de herramientas de administración (el NCache Centro de gestión o sus herramientas de línea de comandos).
Serialización selectiva: NCache permite la serialización selectiva; puede seleccionar miembros de datos de una clase que desee marcar como no serializables. El atributo excluido de cualquier objeto almacenado en caché será nulo o tendrá un valor predeterminado (si está asignado). Esta característica es útil en un escenario donde, para ciertos atributos, no hay necesidad de almacenamiento en caché, por ejemplo, objetos de conexiones para la base de datos. Mediante esta serialización selectiva, el proceso se vuelve aún más eficiente y compacto.
Control granular sobre serialización compacta: Para ello, puede implementar
ICompactSerializable
. Esta interfaz le brinda un control más detallado sobre la serialización compacta; puede controlar qué miembro de datos serializar y cuál excluir según sus necesidades comerciales.Soporte para serialización nativa: NCache admite serialización binaria nativa. Los datos se almacenan en forma serializada en caché, la serialización nativa del cliente es compatible con clientes .NET y Java de NCache.
Implementación de serialización compacta para tipo de objeto
Para utilizar la serialización compacta, los tipos de objetos que se van a serializar de forma compacta deben configurarse a través del NCache Centro de gestion. NCache maneja internamente la serialización/deserialización de clases registradas y el usuario no necesita codificarla explícitamente.
Importante:
Los atributos de clase deben deserializarse en el mismo orden en que se serializaron; de lo contrario, la secuencia serializada no se puede deserializar.
Sin embargo, NCache también permite la implementación explícita de la ICompactSerializable
de la interfaz del.
Para implementar esta interfaz, la clase DemoObject necesita implementar Serialize
y Deserialize
métodos que serán llamados por NCache mientras serializa/deserializa este objeto. A continuación se proporciona un código de muestra para implementar esta interfaz:
Importante:
Si desea marcar una clase para serialización compacta que requiere un constructor parametrizado, asegúrese de que la clase contenga un constructor predeterminado.
Requisitos previos
- Para obtener información sobre los requisitos previos estándar necesarios para trabajar con todos NCache funciones del lado del servidor, consulte la página dada en Requisitos previos de la API del lado del servidor.
- El caché debe estar ejecutándose.
- La aplicación debe ser conectado al caché antes de realizar la operación.
- Para obtener detalles de la API, consulte: ICompactSerializable, Publicar por fascículos, Deserializar, Comprobar si se puede serializar, Proveedor de tipo genérico.
Creando un objeto de demostración
public class DemoObject : ICompactSerializable
{
private string _attribute1;
private int _attribute2;
private bool _attribute3;
public DemoObject()
{ }
public DemoObject(string attrib1, int attrib2, bool attrib3)
{
_attribute1 = attrib1;
_attribute2 = attrib2;
_attribute3 = attrib3;
}
#region ICompactSerializable Members
public void Deserialize(CompactReader reader) {
_attribute1 = reader.ReadObject() as string;
_attribute2 = reader.ReadInt32();
_attribute3 = reader.ReadBoolean();
}
public void Serialize(CompactWriter writer){
writer.WriteObject(_attribute1);
writer.Write(_attribute2);
writer.Write(_attribute3);
}
#endregion
}
Implementación de un controlador de tipo genérico
NCache También permite registrar tipos genéricos en Serialización compacta. Para ello es necesario registrar cada tipo a través del NCache Centro de gestion. Existe otra forma de registrar tipos compactos genéricos a través del "Manejador de tipos genéricos". Con el controlador de tipos genéricos, el usuario puede agregar todos los tipos genéricos a la vez, implementando el IGenericTypeProvider
interfaz. Esto ahorra mucho tiempo y esfuerzo en caso de que el usuario quiera registrar una gran cantidad de tipos.
Importante:
Para utilizar la interfaz, incluya el siguiente espacio de nombres en su aplicación: Alachisoft.NCache.Runtime.GenericTypesProvider
Para implementar esto, el usuario necesita implementar el GetGenericTypes
método y devolver los tipos genéricos deseados en el Type
formación. Después de esto, implemente este ensamblado de clase en el NCache Centro de gestion. NCache El Centro de gestión registrará todos los tipos poblados en el Type
formación. A continuación se proporciona un código de muestra:
Importante:
Si desea marcar una clase para serialización compacta que requiere un constructor parametrizado, asegúrese de que la clase contenga un constructor predeterminado.
public class CustomGenericType<T, K, V>
{ }
public class SetGenerics : IGenericTypeProvider
{
Type[] types = new Type[6];
Type[] IGenericTypeProvider.GetGenericTypes()
{
types[0] = typeof(Dictionary<string, Customer>);
types[1] = typeof(List<int>);
types[2] = typeof(CustomGenericType<Employee, Product, Customer>);
types[3] = typeof(CustomGenericType<Employee, Product, int>);
types[4] = typeof(CustomGenericType<Employee, string, byte>);
types[5] = typeof(CustomGenericType<string, Customer, bool>);
return types;
}
public bool CheckIfSerializable(Type type, FieldInfo fieldInfo)
{
// Implement logic
}
}
Solucionando Problemas
Excepción de serialización compacta
Puede ocurrir una excepción de serialización en el nodo donde los tipos compactos serializables no están registrados.
Solución
Registro Compacto Serializable tipos en todos los nodos del clúster.
Vea también
.NETO: Alachisoft.NCache.Tiempo de ejecución espacio de nombres