C# 通过json发送基类并在客户端转换为父类

C# 通过json发送基类并在客户端转换为父类,c#,json,serialization,deserialization,signalr,C#,Json,Serialization,Deserialization,Signalr,我有两个班小组和联系人 它们都扩展了我的基类ChatTarget 我正在使用信号器将这些对象发送给我的客户端。我的服务器发送数据,而我的客户端端点需要一个ChatTarget对象。在服务器上,我可以从联系人或组转换到聊天目标 将我的ChatTarget发送到我的客户端后,我无法再将ChatTarget转换为它的任何扩展类。json序列化似乎正在破坏扩展属性,只维护基本的ChatTarget内容 我如何才能保留在我的客户端上投射ChatTarget的能力?您有多少潜在的子类型?你有一个小组和联系人

我有两个班
小组
联系人

它们都扩展了我的基类
ChatTarget

我正在使用信号器将这些对象发送给我的客户端。我的服务器发送数据,而我的客户端端点需要一个
ChatTarget
对象。在服务器上,我可以从
联系人
转换到
聊天目标

将我的
ChatTarget
发送到我的客户端后,我无法再将
ChatTarget
转换为它的任何扩展类。json序列化似乎正在破坏扩展属性,只维护基本的
ChatTarget
内容


我如何才能保留在我的客户端上投射
ChatTarget
的能力?

您有多少潜在的子类型?你有一个小组和联系人。您是否预见到其他儿童类型的数量是无限的?你可以考虑的是做一个复合模型来传回。对于exmaple
public类ChatTargetResponse{public GroupTarget Group{get;set;}public ContactTarget Contact{get;set;}}
执行此操作,您有两个显式子级——每种目标类型一个——因此不会产生混淆。如果一个为空,则另一个不为空,即相互排斥。可能还有其他方法,但这种方法可以确保双方的强类型响应。谢谢。这可能对我有用。我会有更多,但不是无限量。尽管如此,我还是希望有一个更好的解决方案。顺便说一句,Eli的解决方案让跨平台的东西变得更难,因为任何自定义反序列化现在都必须深入一层,并进行一系列空检查。那时你一定误解了。这一点是为了使它更跨平台友好,正如您可以自信地知道的,字段是什么(即强类型)。如果在其他平台中创建了强类型存根,则必须基于(比如)一个“类型”字段进行条件反序列化,以了解要反序列化的属性。无论平台如何,我的方法都保持强类型。如果响应类型的字段无关紧要,那么还有其他“匿名类型”选项(例如,直接JSON文档迭代)。或者为特定于子类型的“额外”参数使用字典。