[英]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.