非表示のフィールドを持つ型を使用すると、「メンバーを特定できません」という例外が発生します (属性のない RuntimeTypeModel 経由の V2)。
MetaType.cs のこの行で長さチェックを削除すると、この特別な使用例の問題が解決されます。
if(members != null && members.Length == 1) mi = members[0];
しかし、長さのチェックには理由があるのではないかと心配しているので、単純に削除するだけでは十分な解決策ではないかもしれません. members[0]
この場合、非表示の基底クラス メンバーが配列の最後に配置されるため、使用は機能します。
私のユースケースの簡略化された例:
public class SharedType
{
public int Number { get; set; }
}
public class ClientType : SharedType
{
public new long Number { get; set; }
}
var modelServer = RuntimeTypeModel.Create();
modelServer.Add(typeof(SharedType), false).Add("Number");
var ms = new MemoryStream();
modelServer.Serialize(ms, new SharedType() { Number = 10 });
var modelClient = RuntimeTypeModel.Create();
modelClient.Add(typeof(ClientType), false).Add("Number");
ClientType obj = (ClientType)modelClient.Deserialize(new MemoryStream(ms.ToArray()), null, typeof(ClientType));
実際にはint
、SharedNestedType とlong
ClientNestedType に置き換えます。