La serializzazione trasforma un oggetto in un flusso di byte in modo che possa essere spostato fuori da un processo per la persistenza o per essere inviato a un altro processo. E la deserializzazione è il processo inverso che trasforma un flusso di byte in un oggetto.
Inoltre, a differenza di una cache autonoma, una cache distribuita deve serializzare gli oggetti in modo da poterli inviare a computer diversi nel cluster di cache. Ma il meccanismo di serializzazione fornito da .NET framework ha due grossi problemi:
1. Molto lento: La serializzazione .NET usa Reflection per controllare le informazioni sul tipo in fase di esecuzione. La riflessione è un processo estremamente lento rispetto al codice precompilato.
2. Molto ingombrante: La serializzazione .NET archivia il nome completo della classe, le impostazioni cultura, i dettagli dell'assembly e i riferimenti ad altre istanze nelle variabili membro e tutto ciò rende il flusso di byte serializzato molte volte l'oggetto originale in termini di dimensioni.
Poiché una cache distribuita viene utilizzata per migliorare le prestazioni e la scalabilità dell'applicazione, qualsiasi cosa che ostacoli questa operazione diventa molto critica. Inoltre, la normale serializzazione di .NET è un importante sovraccarico di prestazioni in una cache distribuita perché migliaia di oggetti devono essere serializzati ogni secondo prima di essere inviati alla cache distribuita per l'archiviazione in memoria. E qualsiasi rallentamento qui diventa un rallentamento per la cache distribuita.
L'altro problema è che un flusso di byte serializzato voluminoso consuma 2-3 volte lo spazio in più e riduce la capacità di archiviazione complessiva di una cache distribuita. Uno spazio di archiviazione in memoria non può mai essere grande quanto uno spazio di archiviazione su disco, il che rende questo un problema ancora più delicato per una cache distribuita.
Per superare i problemi di serializzazione .NET, NCache ha implementato un Framework di serializzazione compatto. In questo quadro, NCache memorizza ID di tipo a due byte invece di nomi di classi/assembly completi. Riduce ulteriormente il flusso di byte serializzato serializzando solo i valori dei campi ed escludendone i dettagli del tipo. Infine, NCache Compact Serialization Framework evita l'uso di .NET Reflection a causa del suo sovraccarico accedendo direttamente ai campi e alle proprietà dell'oggetto istanza.
Ci sono due modi di usare NCache Serializzazione compatta nella tua applicazione.
- lasciare NCache generare codice di serializzazione compatta in fase di esecuzione
- Implementa tu stesso un'interfaccia ICompactSerializable
In questo blog, mi atterrò solo al primo approccio. Discuterò il secondo approccio in un blog separato.
lasciare NCache generare codice di serializzazione compatta in fase di esecuzione
Identifica i tipi di oggetti che stai memorizzando nella cache e registrali con NCache come tipi di serializzazione compatta come mostrato nella figura. Questo è tutto ciò che devi fare, e NCache si prende cura di tutto il resto.
Figura 1: tipi di registro per la serializzazione compatta con NCache
NCache invia i tipi registrati a NCache client al momento dell'inizializzazione. In base ai tipi ricevuti, NCache client genera il codice di runtime per serializzare e deserializzare ogni tipo. Il codice di runtime viene generato una sola volta dal NCache client al momento dell'inizializzazione e utilizzato più e più volte. Funziona molto più velocemente della serializzazione basata su Reflection.
Quindi, usando NCache Serializzazione compatta puoi utilizzare in modo efficiente la tua memoria cache distribuita e puoi aumentare le prestazioni delle tue applicazioni.
Quindi, scarica una versione di prova di 60 giorni completamente funzionante di NCache Enterprise e provalo tu stesso.
Ciao,
Comprendiamo che hai messo insieme 2 opzioni sopra. Quando useresti la serializzazione compatta tramite IDE rispetto all'implementazione dell'interfaccia.
-Javed