-
Couldn't load subscription status.
- Fork 174
Description
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.