Skip to content

Serializing and deserializing List<T> returns base type if T isn't abstract/interface #7

@Measurity

Description

@Measurity

Code for testing:

abstract record Entity(string Name);
record WorldEntity(string Name) : Entity(Name);
record PlaceholderGroupWorldEntity(string Name) : WorldEntity(Name);
record BrokenCellEntities(List<WorldEntity> Entities) : Packet;
record WorkingCellEntities(List<Entity> Entities) : Packet;
abstract record Packet;
record Wrapper(Packet Instance);

internal class Program
{
    private static readonly string DesktopFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.json");
    private static Wrapper Read() => BinaryConverter.Deserialize<Wrapper>(File.ReadAllBytes(DesktopFile));
    private static void Write<T>(T instance) where T : Packet => File.WriteAllBytes(DesktopFile, BinaryConverter.Serialize(new Wrapper(instance)));

    public static void Main(string[] args)
    {
        BinaryConverter.RegisterUnion<Packet>(typeof(BrokenCellEntities), typeof(WorkingCellEntities));
        BinaryConverter.RegisterUnion<Entity>(typeof(PlaceholderGroupWorldEntity), typeof(WorldEntity));
        PlaceholderGroupWorldEntity e = new("Placeholder Entity");
        
        // Broken
        Write(new BrokenCellEntities(new List<WorldEntity>() { e }));
        Console.WriteLine((Read().Instance as BrokenCellEntities).Entities.First());
        
        // Workaround
        Write(new WorkingCellEntities(new List<Entity>() { e }));
        Console.WriteLine((Read().Instance as WorkingCellEntities).Entities.First());
    }
}

Which outputs:

WorldEntity { Name = Placeholder Entity } <-- broken
PlaceholderGroupWorldEntity { Name = Placeholder Entity } <-- workaround

See https://github.com/SubnauticaNitrox/BinaryPack/blob/master/src/BinaryPack/Serialization/Processors/Collections/ListProcessor%7BT%7D.cs#L60

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions