簡體   English   中英

Protobuf-net C#:將字段添加到RuntimeTypeModel

[英]Protobuf-net C#: Adding Fields to the RuntimeTypeModel

我試圖在運行時動態地初始化RuntimeTypeModel。 我正在使用下面的功能,直到添加了包含字段的部件,該功能才起作用。 此模型中的基本類型將僅使用ProtoMember屬性,而沒有其他內容(excpet繼承自相應的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() { }

}

AddField()返回父類型而不是派生類型的MetaData。

我有類似的情況,但有相同的錯誤。 “無法確定成員:myField”

問題在於,父類和子類具有myField,后者在子類中從基類繼承而被重新定義(使用新的),因此,當使用RuntimeTypeModel在繼承的類上添加此字段以進行序列化時,它將引發該異常。 對type.GetMember(“ myField”,...)的調用返回2個項目,一個用於子類,一個用於父類,然后拋出。

到目前為止,還沒有針對此問題的官方修補程序。 但是此鏈接為它提供了一個非官方的修復程序(正在更改源代碼): Protobuf-net:使用隱藏成員不起作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM