我需要我的 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 序列化。
相关分类