为了账号安全,请及时绑定邮箱和手机立即绑定

使用JSON格式时如何处理继承的类?

使用JSON格式时如何处理继承的类?

C#
慕标5832272 2021-10-31 19:33:31
我需要我的 web-api 返回Rule以 json 格式序列化的实例列表。[HttpGet][SwaggerOperation(nameof(GetRules))][SwaggerResponse(StatusCodes.Status200OK, typeof(List<Rule>), "Rules")][ProducesResponseType(StatusCodes.Status200OK)]public async Task<IActionResult> GetRules(){    List<Rule> rules = /* retrieve rule from some storage */;    return Ok(rules);}目前,有 2 种规则,每种规则在 Rule 类中共享的规则之上都有特定的属性;一个规则被称为RuleWithExpiration和其他RuleWithGracePeriod。[JsonObject(MemberSerialization.OptIn)]public class Rule{    [JsonProperty("id")]    public Guid Id { get; }    [JsonProperty("name")]    public string Name { get; }    [JsonConstructor]    public Rule(Guid id, string name)    {        Id = id;        Name = name;    }}[JsonObject(MemberSerialization.OptIn)]我遇到的问题是当我尝试反序列化它时,这个类层次结构有问题。反序列化后,我最终得到一个Rule实例列表,因为我不要求序列化程序包含类型信息,因为它被认为是一个安全问题。这是序列化的字符串:[{"someInfo":"Wat?","expiration":"2018-07-26T13:32:06.2287669Z","id":"29fa0603-c103-4a95-b627-0097619a7645","name":"Rule with expiration"},{"gracePeriod":"01:00:00","id":"bd8777bb-c6b3-4172-916a-546775062eb1","name":"Rule with grace period"}]Rule这是反序列化后我得到的实例列表(如 LINQPad 所示):题是否可以在此上下文中保留此继承树,或者我是否必须以某种方式重新排列这些类?如果是这样,这样做的方法是什么?解决方案我还没有找到感觉很好的解决方案。例如,我可以有 RuleAggregate一个这样的类,但是每次我引入一种新规则时,我都必须编辑这个类并处理影响:[JsonObject(MemberSerialization.OptIn)]public class RuleAggregate{    [JsonProperty("expirations")]    public List<RuleWithExpiration> Expirations {get;}    [JsonProperty("gracePeriods")]    public List<RuleWithGracePeriod> GracePeriods {get;}    [JsonConstructor]    public RuleAggregate(List<RuleWithExpiration> expirations, List<RuleWithGracePeriod> gracePeriods)    {        Expirations = expirations;        GracePeriods = gracePeriods;    }}我找到的权衡较少的解决方案 - 如果我想保留继承树 - 是依靠好的 ol' XML 序列化。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 214 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信