Skip to content

SerializerGenerator can't resolve nested serializer dependency #103

@neuecc

Description

@neuecc

I've used SerializerGenerator.GenerateCode for avoid Unity's dynamic code generate.
But generated code seems can't avoid dynamic code generate when class is nested.

For example class A has property of class B.

public class A
{
    public B NestProperty { get; set; }
}

public class B
{
    public int Property { get; set; }
}

It generates there code.

[System.CodeDom.Compiler.GeneratedCodeAttribute("MsgPack.Serialization.CodeDomSerializers.CodeDomSerializerBuilder", "0.6.0.0")]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public class A_Serializer : MsgPack.Serialization.MessagePackSerializer<A> {

    private MsgPack.Serialization.MessagePackSerializer<B> _serializer0;

    public A_Serializer(MsgPack.Serialization.SerializationContext context) : 
            base(context) {
        MsgPack.Serialization.PolymorphismSchema schema0 = default(MsgPack.Serialization.PolymorphismSchema);
        schema0 = null;
        this._serializer0 = context.GetSerializer<B>(schema0);
    }

    // snip...
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("MsgPack.Serialization.CodeDomSerializers.CodeDomSerializerBuilder", "0.6.0.0")]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public class B_Serializer : MsgPack.Serialization.MessagePackSerializer<B> {

    private MsgPack.Serialization.MessagePackSerializer<int> _serializer0;

    public B_Serializer(MsgPack.Serialization.SerializationContext context) : 
            base(context) {
        MsgPack.Serialization.PolymorphismSchema schema0 = default(MsgPack.Serialization.PolymorphismSchema);
        schema0 = null;
        this._serializer0 = context.GetSerializer<int>(schema0);
    }

    // snip...
}

I generate there serializer helper code, too.

public static class MsgPackSerializer
{
    static readonly SerializationContext serializationContext = new SerializationContext
    {
        EnumSerializationMethod = EnumSerializationMethod.ByUnderlyingValue,
        GeneratorOption = SerializationMethodGeneratorOption.Fast,
        SerializationMethod = SerializationMethod.Array
    };

    static MsgPackSerializer()
    {
        serializationContext.Serializers.Register(new A_Serializer(serializationContext));
        serializationContext.Serializers.Register(new B_Serializer(serializationContext));
    }

    public static byte[] Pack<T>(T obj)
    {
        return serializationContext.GetSerializer<T>().PackSingleObject(obj);
    }

    public static T Unpack<T>(byte[] obj)
    {
        return serializationContext.GetSerializer<T>().UnpackSingleObject(obj);
    }
}

If call Serializers.Register(new A_Serializer()) before Serializers.Register(new B_Serializer()), A_Serializer runs
this._serializer0 = context.GetSerializer<B>(schema0); but B_Serializer is not registered yet, so B_Serializer was generated by dynamic code generation.
This is very inconvenient.
In Unity, must avoid dynamic code generation.

Please solve this problem.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementRequires or request to feature enhancement

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions