#c# #serialization #interface
#c# #сериализация #интерфейс
Вопрос:
я получил библиотеку классов myCore.dll он включает в себя класс
public interface IMyClassA {
public string A { get; set; }
public string B { get; set; }
}
public class MyClassA: IMyClassA {
public string A { get; set; }
public string B { get; set; }
}
затем я получил консольный проект с автономным http-сервисом. он ссылается myCode.dll и выполняет некоторое взаимодействие с json через http.
но я хочу скрыть член ‘B’ MyClassA, если я выполняю сериализацию в этом проекте.
я использую Newtonsoft.Json. Но я не хочу ссылаться на Newtonsoft в myCode.dll чтобы установить атрибут [JsonIgnore] в файле MyClassA.B.
итак, как мне создать пользовательский интерфейс в моем консольном проекте, который наследуется от IMyClassA?
Комментарии:
1. Обычно это обрабатывается с помощью конвертеров, но те ожидают, что они украсят целевое свойство, которое, в свою очередь, требует ссылки на Newtonsoft. Вам нужно было бы изучить что-то вроде самостоятельного обхода дерева объектов задания и обработки десериализации на основе реализованных интерфейсов. Я не знаю ограничений вашего проекта, но вы должны спросить себя, стоит ли это сложности и почти определенного снижения производительности.
Ответ №1:
Вы должны написать пользовательский конвертер.
Если вы используете NewtonSoft, у вас будет два метода для переопределения: ReadJson(…) и WriteJson(…), один для сериализации, другой для десериализации. Таким образом, вы можете написать собственный код, отвечающий за сериализацию и десериализацию. Имея свой собственный код, вы можете просто игнорировать член ‘B’ MyClassA.
Для регистрации конвертера вместо использования аннотации в вашем DTO
[JsonConverter(typeof(MyCustomConvreter))]
public interface IMyClassA {
public string A { get; set; }
public string B { get; set; }
}
что приведет к нежелательной ссылке на Newtonsoft, вы можете сделать это, чтобы зарегистрировать пользовательский конвертер:
var jsonSerializer = new JsonSerializer();
jsonSerializer.Converters.Add(new MyCustomConverter());
Проверьте NewtonSoft docs для пользовательского конвертера: https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm