Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SerializerGenerator can't resolve nested serializer dependency #103

Closed
neuecc opened this issue Aug 3, 2015 · 1 comment
Closed

SerializerGenerator can't resolve nested serializer dependency #103

neuecc opened this issue Aug 3, 2015 · 1 comment
Labels
enhancement Requires or request to feature enhancement

Comments

@neuecc
Copy link

neuecc commented Aug 3, 2015

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.

@yfakariya yfakariya added the enhancement Requires or request to feature enhancement label Aug 4, 2015
yfakariya added a commit that referenced this issue Aug 9, 2015
This commit ease custom serialalizer registration because app code can register custom serializer on demand and/or detect not registered serializer(s) exists. It should help more efficient development/debugging and more robust application.
@yfakariya
Copy link
Member

Added new SerializationContext.ResolveSerializer event in 0.6.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement Requires or request to feature enhancement
Projects
None yet
Development

No branches or pull requests

2 participants