【发布时间】:2021-02-12 13:31:01
【问题描述】:
我厌倦了序列化相当大的实体列表,这些实体都是从基类派生的。 我只需要客户端中的基类属性。如何在不实例化基类的新实例的情况下实现这一点?
我尝试创建自定义 ContractResolver,但它似乎在运行时执行 getType(),而不是使用正在序列化的列表/数组的类型
请参阅下面的代码示例。
我想实现。 castBaseString == actualBaseString ;
所以我希望 castBaseString = [{"Id":1},{"Id":2}] 而不是 [{"Value":"value","Id":1},{"Value":"value2","Id":2}]
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Tests {
[TestClass]
public class JsonNetTest {
class Base {
public int Id { get; set; }
}
class Derived : Base {
public string Value { get; set; }
}
class OtherDerived : Base {
public string Value { get; set; }
public string OtherValue { get; set; }
}
[TestMethod]
public void Test() {
IEnumerable<Derived> deriveds = new Derived[] {
new Derived {Id = 1, Value = "value" },
new Derived {Id = 2, Value = "value2" }
};
IEnumerable<Base> castBases = deriveds.Cast<Base>().ToList();
IEnumerable<Base> bases = new Base[] {
new Base {Id = 1 },
new Base {Id = 2 }
};
JsonSerializerSettings s = new JsonSerializerSettings();
var derString = JsonConvert.SerializeObject(deriveds, s);
var castBaseString = JsonConvert.SerializeObject(castBases, s);
var actualBaseString = JsonConvert.SerializeObject(bases, s);
Assert.AreEqual(actualBaseString, castBaseString);
Assert.AreNotEqual(castBaseString, derString);
}
}
}
根据评论进行编辑
附加上下文:
为了清楚起见,我只是发布了这个简单的测试用例。
正在使用的实际上下文是在 aspnet 核心应用程序中。
假设有 3 个控制器
- /api/DerivedController/
- /api/OtherDerivedController/
- /api/BaseController/
当客户端调用 1 时,我们希望返回 Derived 列表,当客户端调用 2 我们想在他们调用时返回一个 OtherDerived 的列表 3 我们想返回一个 Base
的列表数据存储在数据库 TBL_DERIVED 和 TBL_OTHERDERIVED 的 2 个不同的表中。
当他们调用 base 时,我们想要实现的是从这些表中的一个或两个返回数据,而只是这些表的公共属性。
希望这可以澄清。
【问题讨论】: