1

使用带有隐藏字段的类型会导致“无法确定成员”异常(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));

实际上,我会用intSharedNestedType 和longClientNestedType 代替。

4

0 回答 0