使用带有隐藏字段的类型会导致“无法确定成员”异常(V2 通过 RuntimeTypeModel 没有任何属性)。
在 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 代替。