On the road to breaking size limits, the futur of protobuf-net could be using Utf8String, Span<T>,ValueTask<T> when usefull and “Channels” (from corefxlab): Code, code and more code.: protobuf-net: large data, and the future
Serialization
ZeroFormatter: Fastest C# Serializer and Infinitely Fast Deserializer for .NET, .NET Core and Unity
A C# serializer a la Cap’n Proto. Data is not really serialized and deserialized but a data wrapper is generated to dig into byte[] when possible. Deserialization is really quick but an time penalty occures on each access. Really efficient when only a small part of deserialized data are needed. You pay only for what you use.
No DSL (like .proto) is used but serialized type must permit subclassing properties acces. Each property must be virtual and a derived class is dynamically generated under the hood. A pre compiler exists for Unity.
Akavache: An asynchronous, persistent key-value store
A persistent asynchrounious dictionary of blob indexed by string. Usefull to implement cache of JSON.Net, HTTP Requests, Images or User credential (a BlobCache.Secure can be used for encrypted store). SQLite3 can(/should) be used for better reliable and concurency capacities.
And, of course, available as Portable Class Library (PCL): github/Akavache.
Analysis of json serializer .Net implementations
Customizing $type property in Json.NET
Very interresting use of “SerializationBinder.BindToName method that translates a Type to a custom string“ to change Json.Net behavior:
Resolving the Unknown: Building Custom XmlResolvers in the .NET Framework
How to abstract Xml content location from reading: Resolving the Unknown: Building Custom XmlResolvers in the .NET Framework.
and can also be used with a more modern :
XmlResourceResolver resolver = new XmlResourceResolver();
XmlReaderSettings settings = new XmlReaderSettings() { XmlResolver = resolver;};
XDocument doc = XDocument.Load(XmlReader.Create(url,settings));
Json.NET 4.5 Release 4 – Portable Class Library Build – James Newton-King
Portable Class Library is on track, main libraries are adopting it:
Json.NET 4.5 Release 4 – Portable Class Library Build – James Newton-King.
SerializationBinder Class
Je viens, par hazard, de découvrir une nouvelle classe du framework .Net: SerializationBinder. Elle permet customiser les Types utilisés lors de la désérialisation.
Pour chaque nouveau type sauvegardé, la sérialisation binaire stocke les strings assemblyName et typeName dans le binaire. Lors de la désérialisation, ces informations sont utilisées pour obtenir le Type à désérialiser. Mais on peut insérer son code sous la forme d’une instance d’une classe dérivée de SerializationBinder. Son unique méthode (Type BindToType(string assemblyName, string typeName) ) se charge de trouver le bon type. Il est alors très simple de faire la substitution.
Il y a peine deux semaines, j’ai eu un besoin qui aurrait pu être trivial avec cette classe. J’ai renomé le namespace de base de tout un framework métier. Donc tous les types se sont retrouvés renomés de A.Namespace.TypeN en B.Namespace.TypeN. Evidement, des données sérialisées faisaient intervenir toute une arborescence de ces types (N allant de 1 à beaucoup). J’ai eu besoin de relire un fichier A avec les composants B. J’ai bien pensé automatiser le processus en réalisant une moulinette référençant A.dll et b.dll. Cette moulinette aurait su nativement désérialiser l’arborescence de A et sérialiser une arborescence de B, mais il restait à convertir toutes les instances des éléments de A en équivalent B. Soit un nombre important de fonction de conversion à écrire. SerializationBinder aurait permis de faire celà en quelques lignes…