c # Как указать пользовательский интерфейс для сериализации

#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