A serialização transforma um objeto em um fluxo de bytes para que ele possa ser movido para fora de um processo por persistência ou para ser enviado para outro processo. E a desserialização é o processo inverso que transforma um fluxo de bytes de volta em um objeto.
E, diferentemente de um cache autônomo, um cache distribuído deve serializar objetos para que possa enviá-los para diferentes computadores no cluster de cache. Mas, o mecanismo de serialização fornecido pelo .NET framework tem dois grandes problemas:
1. Muito lento: A serialização .NET usa o Reflection para inspecionar as informações de tipo em tempo de execução. A reflexão é um processo extremamente lento em comparação com o código pré-compilado.
2. Muito volumoso: A Serialização .NET armazena o nome completo da classe, cultura, detalhes do assembly e referências a outras instâncias em variáveis de membro e tudo isso torna o fluxo de bytes serializado muitas vezes maior do que o tamanho do objeto original.
Como um cache distribuído é usado para melhorar o desempenho e a escalabilidade de seu aplicativo, qualquer coisa que impeça isso se torna muito importante. E a serialização .NET regular é uma sobrecarga de desempenho importante em um cache distribuído porque milhares de objetos precisam ser serializados a cada segundo antes de serem enviados ao cache distribuído para armazenamento na memória. E, qualquer desaceleração aqui se torna uma desaceleração para o cache distribuído.
O outro problema é que um fluxo de bytes serializado volumoso consome 2-3 vezes mais espaço e reduz a capacidade geral de armazenamento de um cache distribuído. Um armazenamento em memória nunca pode ser tão grande quanto um armazenamento em disco, o que torna esse um problema ainda mais sensível para um cache distribuído.
Para superar problemas de serialização .NET, NCache implementou um Estrutura de serialização compacta. Neste quadro, NCache armazena IDs de tipo de dois bytes em vez de nomes de assembly/classe totalmente qualificados. Reduz ainda mais o fluxo de bytes serializado apenas serializando os valores de campo e excluindo seus detalhes de tipo. Finalmente, NCache Compact Serialization Framework evita o uso do .NET Reflection devido à sua sobrecarga acessando diretamente os campos e as propriedades do objeto de instância.
Existem duas maneiras de usar NCache Serialização compacta em sua aplicação.
- Deixei NCache gerar código de serialização compacta em tempo de execução
- Implemente você mesmo uma interface ICompactSerializable
Neste blog, vou me ater apenas à primeira abordagem. Discutirei a segunda abordagem em um blog separado.
Deixei NCache gerar código de serialização compacta em tempo de execução
Identifique os tipos de objetos que você está armazenando em cache e registre-os com NCache como tipos de serialização compacta, conforme mostrado na Figura. Isso é tudo que você tem que fazer, e NCache cuida do resto.
Figura 1: Tipos de registro para serialização compacta com NCache
NCache envia os tipos registrados para NCache cliente no momento da inicialização. Com base nos tipos recebidos, NCache cliente gera o código de tempo de execução para serializar e desserializar cada tipo. O código de tempo de execução é gerado apenas uma vez pelo NCache cliente no momento da inicialização e usado repetidamente. Ele é executado muito mais rápido do que a serialização baseada em reflexão.
Portanto, usando NCache Com a Serialização Compacta, você pode utilizar com eficiência sua memória cache distribuída e aumentar o desempenho do seu aplicativo.
Então, baixe um teste de 60 dias totalmente funcional do NCache Enterprise e experimente você mesmo.
Oi,
Entendemos que você juntou 2 opções acima. Quando você usaria a serialização compacta por meio do IDE versus a implementação da interface.
-Javed