使用带有隐藏字段的类型会导致“无法确定成员”异常 (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));
实际上,我会用SharedNestedType替换int
,用ClientNestedType替换long
。