Установите имя ключа / класса, используя YamlDo tNet или SharpYaml - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь (де) сериализовать следующие YAML, используя YamlDo tNet или SharpYaml:

network:
  IF1:
    gateway4: 10.1.0.1        
    addresses:
      - 10.1.0.10/24
      - 10.1.0.20/24
  IF2:
    gateway4: 10.2.0.1        
    addresses:
      - 10.2.0.10/24
      - 10.2.0.20/24

У меня есть C# класс:

public class NetworkConfig
{
    public class Network
    {
        //[ClassName]
        public string NetworkName { get; set; }

        public List<Interface> Interfaces;

        public class Interface
        {
            //[ClassName]
            public string InterfaceName { get; set; }
            public string gateway4;
            public List<String> addresses;
        }
    }
}

Instantiation:

var NetworkCfg = new NetworkConfig();
var Network = new NetworkConfig.Network();
Network.NetworkName = "network";
Network.Interfaces = new List<NetworkConfig.Network.Interface> {
    new NetworkConfig.Network.Interface
    {
        InterfaceName = "IF1",
        gateway4 = "10.1.0.1",
        addresses = new List<string> { "10.1.0.10/24", "10.1.0.20/24"}
    },
    new NetworkConfig.Network.Interface
    {
        InterfaceName = "IF2",
        gateway4 = "10.2.0.1",
        addresses = new List<string> { "10.2.0.10/24", "10.2.0.20/24"}
    }
};

Как назвать ключ / класс Network и Interface?

Одним из решений, которое я мог бы придумать, был бы атрибут для свойства, что-то вроде [ClassName] но я не смог найти.

1 Ответ

0 голосов
/ 09 апреля 2020

Ваша проблема в том, что ваша структура YAML не соответствует структуре вашего класса. Структура YAML, которую вы показываете, в основном

Dictionary<string, Dictionary<string, Interface>>

без InterfaceName в Interface. Как видите, имя вашей сети и интерфейсов находится на другом уровне, нежели объекты, которые они называют, поэтому вы не можете просто загрузить их в объект с помощью аннотации.

У вас есть два варианта:

  • Загрузите YAML в тип, описанный выше, а затем постобработайте его в вашей структуре типов.
  • Реализуйте пользовательский конструктор и представитель для вашей иерархии типов, которые (де) сериализуют его в структуру YAML Вы хотите.

Последний вариант несколько быстрее, но я бы сказал, что усилия не стоят.

...