我需要我的 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
提交
取消