rikimaru0345 / Ceras

Universal binary serializer for a wide variety of scenarios https://discord.gg/FGaCX4c
MIT License
483 stars 53 forks source link

Bug: Key comparer is not preserved in serializing/deserializing immutable collections #75

Open dbolin opened 4 years ago

dbolin commented 4 years ago

Test code:

            var config = new SerializerConfig();
            config.UseImmutableFormatters();

            var s = new CerasSerializer(config);

            var o = ImmutableDictionary<string, int>.Empty.WithComparers(StringComparer.OrdinalIgnoreCase);

            var x = s.Serialize(o);

            var y = s.Deserialize<ImmutableDictionary<string, int>>(x);

            Console.WriteLine(o.KeyComparer.GetType());
            Console.WriteLine(y.KeyComparer.GetType());

Actual output: System.OrdinalIgnoreCaseComparer System.Collections.Generic.GenericEqualityComparer`1[System.String]

Expected output: System.OrdinalIgnoreCaseComparer System.OrdinalIgnoreCaseComparer

rikimaru0345 commented 4 years ago

Yep, none of the collection formatters persist the equality comparer.

I guess that's something that should be fixed for some of them.

I think the commonly known types like list, hash set, dictionary,... Should have their equality comparer saved and restored.

For all others, it is not possible I think. We can not assume anything about some custom IList implementation.

For those troublesome cases a custom formatter can be written (which is extremely).

For immutable collections I'll count that as a bug as well. I've added it to my Todo list. Until then, you can use a custom formatter. (let me know if anything is unclear about that :smile:)