使用 YamlDotNet 或 SharpYaml 设置 key/class 的名称

Set name of key/class using YamlDotNet or SharpYaml

我正在尝试使用 YamlDotNet 或 SharpYaml 对以下 YAML 进行(反)序列化:

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# class:

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;
        }
    }
}

实例化:

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"}
    }
};

如何命名 key/class NetworkInterface

我能想到的一个解决方案是 属性 的属性,类似于 [ClassName],但我一直找不到。

您的问题是您的 YAML 结构与您的 class 结构不匹配。你展示的YAML结构基本上是

Dictionary<string, Dictionary<string, Interface>>

Interface 中没有 InterfaceName。如您所见,您的网络和接口的名称与它们所命名的对象处于另一个级别,因此您不能简单地通过注释将它们加载到对象中。

您有两个选择:

  • 将 YAML 加载到上述类型中,然后post-将其处理为您的类型结构。
  • 为您的类型层次结构实施自定义构造函数和表示器,将其(反)序列化为您想要的 YAML 结构。

后一种选择要快一些,但我认为这不值得。