Hyperion icon indicating copy to clipboard operation
Hyperion copied to clipboard

TypeManifest written, even if Type is registered via "knownTypes"

Open jogibear9988 opened this issue 3 years ago • 3 comments

Try this Code:

    class Temp
    {
        public object[] SubArray { get; set; }
    }

    [Fact]
    public void WritesManifestEvenIfKnown()
    {
        var stream = new MemoryStream();
        var msg = new Temp() { SubArray = new object[] { 1, 2, 3 } };
        var serializer = new Serializer(new SerializerOptions(knownTypes: new[] { typeof(Temp), typeof(object[]) }));
        serializer.Serialize(msg, stream);
        stream.Position = 0;
        var res = serializer.Deserialize(stream);
    }

Manifest for "object[]" ist still written, even if it's known

jogibear9988 avatar Sep 23 '20 08:09 jogibear9988

Changeing following line in ArraySerializerFactory from

  typeMapping.TryAdd(type, arraySerializer);

to:

        if (serializer.Options.KnownTypesDict.TryGetValue(type, out var index))
        {
            var wrapper = new KnownTypeObjectSerializer(arraySerializer, index);
            typeMapping.TryAdd(type, wrapper);
        }
        else
            typeMapping.TryAdd(type, arraySerializer);

would fix it, but don't know if it's okay

jogibear9988 avatar Sep 23 '20 09:09 jogibear9988

In Dictionay Serilizer the same,

change

            typeMapping.TryAdd(type, ser);

to

        if (serializer.Options.KnownTypesDict.TryGetValue(type, out var index))
        {
            var wrapper = new KnownTypeObjectSerializer(ser, index);
            typeMapping.TryAdd(type, wrapper);
        }
        else
            typeMapping.TryAdd(type, ser);

jogibear9988 avatar Sep 23 '20 12:09 jogibear9988

@Arkatufus do you have a plan for a new nuget release?

jogibear9988 avatar Nov 08 '20 10:11 jogibear9988