Protobuf-net C#:向RuntimeTypeModel添加字段

时间:2015-11-05 19:55:53

标签: c# runtime protocol-buffers protobuf-net custom-attributes

我正在尝试在运行时动态初始化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() { }

}

2 个答案:

答案 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