Skip to content

Instantly share code, notes, and snippets.

@neuecc
Last active August 29, 2015 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neuecc/47bc4b1c5973f630bc52 to your computer and use it in GitHub Desktop.
Save neuecc/47bc4b1c5973f630bc52 to your computer and use it in GitHub Desktop.
// RegisterSerializer(type)を対象になるクラスに走らせる
// (ListとDictは本体も生成したほうがいいので修正@21:14)

var alreadyGenerated = new HashSet<Type>();
var specializedSerializers = new HashSet<string>();
Action<Type> RegisterSerializer = null;
RegisterSerializer = type =>
{
    if (type.IsArray) type = type.GetElementType();
    if (!alreadyGenerated.Add(type)) return;

    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
    {
        RegisterSerializer(type.GetGenericArguments()[0]);
    }
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>))
    {
        RegisterSerializer(type.GetGenericArguments()[0]);
        RegisterSerializer(type.GetGenericArguments()[1]);
    }
    var outputSerializerPath = SerializerGenerator.GenerateCode(settings, type).ToArray();
    if (outputSerializerPath.Length == 0) return;
    foreach (var item in outputSerializerPath)
    {
        specializedSerializers.Add(item);
    }

    // recursive properties...
    foreach (var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.SetProperty))
    {
        RegisterSerializer(prop.PropertyType);
    }
};

んで、最後にこんなふうに吐き出してる

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

    static PhotonMsgPackSerializer()
    {
        // みつかった型の分だけRegisterしてる
        serializationContext.Serializers.Register(new PhotonWire_Sample_ServerApp_Hubs_TakoxSerializer(serializationContext));
        serializationContext.Serializers.Register(new PhotonWire_Sample_ServerApp_Hubs_YappySerializer(serializationContext));
        serializationContext.Serializers.Register(new PhotonWire_Sample_ServerApp_Hubs_MoreSerializer(serializationContext));
    }
    
    // しりあらいずとでしりあらいずはこの中で serializationContext.GetSerializer<T>() 経由で。
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment