Serializzatore e deserializzatore più veloci con il minimo ingombro di memoria in C #?
Domanda
Attualmente sto usando il formattatore binario (Remoting) per serializzare e deserializzare gli oggetti da inviare sulla mia LAN.
Ho recentemente aggiornato da 2.0 a .NET 3.5. 3.5 ha introdotto nuovi tipi per migliorare le prestazioni di serializzazione?
Ho esaminato il DataContractSerializer
, ma questo serializza qualsiasi cosa sul diritto XML sottostante ... che deve aumentare il footprint di memoria.
Qual è il serializzatore più veloce per l'invio di oggetti attraverso la mia LAN? Non mi interessa un interoperabilità o il controllo delle versioni .... Ho bisogno di velocità!
Sono aperto a alternative open source di terze parti.
Soluzione
Sembra che Buffer di protocollo potrebbe essere quello che stai cercando.
Esistono tre implementazioni .NET di cui sono a conoscenza: protobuf-net , protobuf-csharp-port e Proto # .
I confronti di prestazioni mostrano che i buffer di protocollo superano quelli integrati serializzatori in termini di dimensioni e velocità di serializzazione / deserializzazione.
Altri suggerimenti
Ho alcuni benchmark per il principale .NET serializzatori disponibili in base al set di dati Northwind.
@marcgravell binary protobuf-net è l'implementazione più veloce analizzata che è circa 7x più veloce del serializzatore più veloce disponibile di Microsoft (XML DataContractSerializer) nel BCL.
JsonDataContractSerializer di Microsoft è piuttosto lento - rispetto a 9x più lento di quel protobuf-net e oltre 3,6x più lento del mio JsonSerializer .
Nel confronto delle prestazioni collegato da @Luke, nota che DataContractJsonSerializer
funziona molto bene rispetto agli altri serializzatori MS.
Data l'ubiquità di JSON e la facilità con cui è possibile utilizzare DataContractJsonSerializer
, non vedo molte ragioni per usare " buffer di protocollo " ;. JSON sarà più facile da eseguire il debug quando si rimbalza tra lingue e piattaforme e si comprimerà magnificamente.
(Adoro il modo in cui Google prende i concetti di CS 101 e diventa famoso per implementarli. In C, chiamiamo "buffer di protocollo" e "struct". Funzionano alla grande.)
Come ho dimostrato in questa risposta il codice generato potrebbe essere il serializzatore più veloce. Tuttavia è in una fase iniziale e manca ancora un paio di funzionalità che offrono altri serializzatori.