Я устал сериализовать довольно большой список сущностей, которые все являются производными от базового класса. Мне нужны только свойства базового класса в клиенте. Как мне добиться этого без создания нового экземпляра базового класса?
Я попытался создать собственный ContractResolver, но кажется, что он выполняет getType() во время выполнения вместо использования сериализуемого типа списка/массива.
См. пример кода ниже.
Я хочу добиться. castBaseString == фактическаяBaseString ;
Поэтому я хочу, чтобы 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/Производный контроллер/
- /api/Другой производный контроллер/
- /апи/Базовый Контроллер/
когда клиент вызывает 1, мы хотим вернуть список Derived, когда клиент вызывает 2, мы хотим вернуть список OtherDerived, когда он вызывает 3, мы хотим вернуть список базы
Данные хранятся в 2 разных таблицах в базе данных TBL_DERIVED и TBL_OTHERDERIVED.
Чего мы хотим добиться, когда они вызывают base, так это возврата данных из одной или обеих этих таблиц, но только общих свойств этих таблиц.
Надеюсь, это прояснит.