using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using KGySoft.CoreLibraries;
using KGySoft.Serialization.Binary;
public static void Main()
var instance = ThreadSafeRandom.Instance.NextObject<Dictionary<int, List<string>>>();
Console.WriteLine($"Generated object: {Dump(instance)}");
using (var ms = new MemoryStream())
formatter = new BinarySerializationFormatter();
formatter.Serialize(ms, instance);
object deserialized = formatter.Deserialize(ms);
Console.WriteLine($"Deserialized object {Dump(deserialized)}");
Console.WriteLine($"Length by BinarySerializationFormatter: {ms.Length}");
using (var ms = new MemoryStream())
formatter = new BinaryFormatter();
formatter.Serialize(ms, instance);
Console.WriteLine($"Serialization by BinaryFormatter failed: {e.Message}");
Console.WriteLine($"Length by BinaryFormatter: {ms.Length}");
private static string Dump(object o)
if (o is IConvertible convertible)
return convertible.ToString(CultureInfo.InvariantCulture);
if (o is IFormattable formattable)
return formattable.ToString(null, CultureInfo.InvariantCulture);
if (o is IEnumerable enumerable)
return $"[{enumerable.Cast<object>().Select(Dump).Join(", ")}]";
return $"{{{o.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(p => $"{p.Name} = {Dump(p.GetValue(o))}").Join(", ")}}}";