// 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>() 経由で。
}