リフレクションによってロードされた proto シリアライザーを使用して階層型をシリアライズしようとすると、奇妙な動作をしているように見え、実際には機能していないようです。
コードは次のとおりです。
[ProtoContract]
[ProtoInclude(10, typeof(Derived))]
class Base
{
[ProtoMember(1)]
public string BaseFirstProperty { get; set; }
[ProtoMember(2)]
public string BaseSecProperty { get; set; }
}
[ProtoContract]
class Derived : Base
{
[ProtoMember(1)]
public string DerivedFirstProperty { get; set; }
}
static void Main(string[] args)
{
var assembly = Assembly.LoadFile(@"c:\protobuf-net.dll");
var derived = new Derived()
{
BaseFirstProperty = "BaseFirst",
BaseSecProperty = "BaseSec",
DerivedFirstProperty = "DerivedFirst"
};
var reflectionSerializer = assembly.GetType("ProtoBuf.Serializer");
var getTypeSerializer = typeof(Serializer);
var reflectionMethods = reflectionSerializer.GetMethods(BindingFlags.Static | BindingFlags.Public);
var reflectionGenericMethodInfo = reflectionMethods.First<MethodInfo>(method => method.Name == "SerializeWithLengthPrefix");
var reflectionSpecificMethodInfo = reflectionGenericMethodInfo.MakeGenericMethod(new Type[] { derived.GetType() });
var getTypeMethods = getTypeSerializer.GetMethods(BindingFlags.Static | BindingFlags.Public);
var getTypeGenericMethodInfo = getTypeMethods.First<MethodInfo>(method => method.Name == "SerializeWithLengthPrefix");
var getTypeSpecificMethodInfo = getTypeGenericMethodInfo.MakeGenericMethod(new Type[] { derived.GetType() });
var reflectionStream = new MemoryStream();
var getTypeStream = new MemoryStream();
reflectionSpecificMethodInfo.Invoke(null, new object[] { reflectionStream, derived, PrefixStyle.Base128 });
getTypeSpecificMethodInfo.Invoke(null, new object[] { getTypeStream, derived, PrefixStyle.Base128 });
Console.WriteLine(reflectionStream.ToArray().Length); // Prints out 15
Console.WriteLine(getTypeStream.ToArray().Length); // Prints out 37
}
私の知る限り、同じように動作するはずです...何が間違っていますか? Proto-buf 2.0.0.431 を使用していることに注意してください。ありがとう、