我正在尝试在运行时动态初始化RuntimeTypeModel。我正在使用以下功能,直到我添加包含Fields的部分。此模型中的基类型将仅使用ProtoMember属性而不使用其他任何内容(从适当的基类继承的excpet)来指定可序列化的内容。这是错误的代码。
MetaType childMetaData = model[parentType].AddSubType(includeTagNumber++, child);
foreach (MemberInfo fi in child.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).OrderBy(x => x.Name).Reverse())
{
if (fi.MemberType == MemberTypes.Field || fi.MemberType == MemberTypes.Property)
{
if (fi.DeclaringType.Equals(child))
{
ProtoMemberAttribute attr = fi.GetCustomAttribute<ProtoMemberAttribute>();
if (attr.IsNotNull())
{
childMetaData.Add(attr.Tag, fi.Name); //Error here...
}
}
}
}
我收到一个ArgumentException,表示无法确定任何字段的memberName参数。
修改 我查看了protobuf-net的trunk和v1代码,并运行了以下行:
MemberInfo[] members = type.GetMember(memberName, Helpers.IsEnum(type) ? BindingFlags.Static | BindingFlags.Public : BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if(members != null && members.Length == 1) mi = members[0];
if (mi == null) throw new ArgumentException("Unable to determine member: " + memberName, "memberName");
当我在调用之前在线上运行相同的行时,它们会按预期出现,并返回MemberInfo [1] ...为什么?有什么帮助吗?
示例类:
class SerializedButton : VProtoCapable
{
[ProtoMember(1, IsRequired=true)]
private int someData
public int SomeData
{
get { return someData; }
set { someData = value; }
}
public SerializedButton() { }
}
答案 0 :(得分:0)
AddField()返回父类型的MetaData,而不是派生类型。
答案 1 :(得分:0)
我有类似的情况,同样的错误。 &#34;无法确定成员:myField&#34;
问题是父类和子类有myField,后者在子类中重新定义(使用new)继承自基类,因此当使用RuntimeTypeModel添加此字段以在继承类上进行序列化时,它会抛出该异常。对type.GetMember的调用(&#34; myField&#34;,...)返回2个项目,一个用于子类,一个用于父类,并且抛出。
到目前为止,还没有正式解决此问题的方法。但是此链接提供了非官方修复(更改源代码):Protobuf-net: Using Hidden Members does not work