Biser is a cross-platform Binary and JSON Serializer for .NET / dotnet / core / standard / CoreRT / Mono WASM / C#
Branch: master
Clone or download
Latest commit a8cff66 Feb 10, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
Benchmark No commit message Aug 24, 2018
Biser Binary supports arrays of all types Feb 7, 2019
BiserObjectify No commit message Feb 10, 2019
BiserObjectify_Standard No commit message Feb 4, 2019
BiserTest_Net BiserObjectify examples Feb 10, 2019
Biser_Standard Release 1.8.0 Sep 10, 2018
Deployment No commit message Feb 10, 2019
Docu No commit message Feb 22, 2018
js No commit message Jun 4, 2018
licenses No commit message Feb 5, 2019
LICENSE Initial commit Feb 19, 2018 No commit message Feb 10, 2019


Image of Build Image of Build NuGet Badge NuGet Badge Image of Build

Cross-platform BINARY and JSON serializer for .NET dotnet.

  • Doesn't use reflection inside, only managed code, perfectly works in MONO WASM and CoreRT where AOT compilers are used, that makes it a possible alternative to protobuf-net, MessagePack, NetJSON, JSON.NET.
  • Has the same operational speed (Benchmark) as protobuf-net and NetJSON, smaller payload and a tiny source code.
  • Has custom encoding possibilities of any complexity.
  • Different encoding/decoding scenarios for one object are supported.
  • Thread safe. No need to "warm up" serializing/encoding entities.

Integrated part of DBreeze database, used in Raft.NET

Quick start

  • Grab from NuGet Biser (or DBreeze that contains Biser), grab from Nuget BiserObjectify.
  • Let’s assume you have several objects to serialize. It is necessary to prepare them:

Call next line to create code for the serialzer:

 var resbof = BiserObjectify.Generator.Run(typeof(TS6),true, 
      @"D:\Temp\1\", forBiserBinary: true, forBiserJson: true, null);

First argument is the type of the root object to be serialized (it can contain other objects that also must be serialized). Second argument means that BiserObjectify must prepare serializer for all objects included into the root object. Third argument points to the folder where C# files per object will be created. The fourth and fifth arguments mean that we want to use both Binary and JSON serializers. The sixth argument is a HashSet (or null) with the property names that will not be serialized.

resbof variable will contain the same information that in generated files also as a Dictionary.

  • Copy generated files into your project and embed/link them to the project. Try to recompile.
  • Probably, it will be necessary to add “partial” keyword to objects that must be serialized:
 public partial class TS6
        public string P1 { get; set; }
  • Remove BiserObjectify from your project, it will not be necessary until next time. Usage:
 TS6 t6 = new TS6()
                P1 = "dsfs",
                P2 = 456,
                P3 = DateTime.UtcNow,
                P4 = new List<Dictionary<DateTime, Tuple<int, string>>>
                        new Dictionary<DateTime, Tuple<int, string>>{
                            { DateTime.UtcNow.AddMinutes(-1), new Tuple<int, string>(12,"testvar") },
                            { DateTime.UtcNow.AddMinutes(-2), new Tuple<int, string>(125,"testvar123") }
                        new Dictionary<DateTime, Tuple<int, string>>{
                            { DateTime.UtcNow.AddMinutes(-3), new Tuple<int, string>(17,"dsfsdtestvar") },
                            { DateTime.UtcNow.AddMinutes(-4), new Tuple<int, string>(15625,"sdfsdtestvar") }
                P5 = new Dictionary<int, Tuple<int, string>> {
                     { 12, new Tuple<int, string>(478,"dsffdf") },
                     { 178, new Tuple<int, string>(5687,"sdfsd") }
                P6 = new Tuple<int, string, Tuple<List<string>, DateTime>>(445, "dsfdfgfgfg", 
                new Tuple<List<string>, DateTime>(new List<string> { "a1", "a2" }, DateTime.Now.AddDays(58))),
                P7 = new List<string> { "fgdfgrdfg", "dfgfdgdfg" },
                P8 = new Dictionary<int, List<string>> {
                        { 34,new List<string> { "drtttz","ghhtht"} },
                        { 4534,new List<string> { "dfgfghfgz","6546ghhtht"} }
				P25 = new Dictionary<int, List<string[,][][,,]>>[,,,][][,,]


Binary serialization:

 var serializedObjectAsByteArray = t6.BiserEncoder().Encode();
 var retoredBinaryObject= TS6.BiserDecode(serializedObjectAsByteArray);
NOTE (for Binary serializer only)
  • To have consistent data, after first serialization and storing byte[] into database - never delete serialized object/class properties.
  • To have consistent data, after first serialization and storing byte[] into database - add new properties only to the end of the object/class, after all other properties are listed.

JSON serialization:

 var jsonSettings = new Biser.JsonSettings { DateFormat = Biser.JsonSettings.DateTimeStyle.ISO };
 string prettifiedJsonString = new Biser.JsonEncoder(t6, jsonSettings)
 var restoredJsonObject= TS6.BiserJsonDecode(prettifiedJsonString, settings: jsonSettings);
NOTE (for JSON serializer only)
  • JSON serializer can also store multi-dimensional arrays like [,,] [,] [,,,] etc., representing it as a Tuple<List, object itself> where Item1 represents array dimensions.
Example of the TS6 object for serialization and generated by BiserObjectify Binary and JSON serializer

For the deep understanding: