【问题标题】:Protobuf-net C#: Adding Fields to the RuntimeTypeModelProtobuf-net C#:向 RuntimeTypeModel 添加字段
【发布时间】:2015-11-05 19:55:52
【问题描述】:

我正在尝试在运行时动态初始化 RuntimeTypeModel。我正在使用以下功能,该功能一直有效,直到我添加了包含字段的部分。此模型中的基本类型将仅使用 ProtoMember 属性,而没有其他任何东西(从适当的 bas 类继承的除外)来指定可以序列化的内容。这是错误的代码。

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 的主干和 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() { }

}

【问题讨论】:

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


    【解决方案1】:

    AddField() 返回父类型的元数据,而不是派生类型。

    【讨论】:

      【解决方案2】:

      我有一个类似的场景,有同样的错误。 "无法确定成员:myField"

      问题是父类和子类都有myField,后者在继承自基类的子类中重新定义(使用new),因此当使用RuntimeTypeModel添加此字段以在继承类上进行序列化时会抛出该异常.对 type.GetMember("myField",...) 的调用返回 2 项,一项用于子类,一项用于父类,然后抛出。

      到目前为止,还没有针对此问题的官方修复。但是这个链接提供了一个非官方的修复(更改源代码):Protobuf-net: Using Hidden Members does not work

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多