【问题标题】:Set name of key/class using YamlDotNet or SharpYaml使用 YamlDotNet 或 SharpYaml 设置键/类的名称
【发布时间】:2020-04-09 07:59:06
【问题描述】:

我正在尝试使用 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# 类:

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

如何命名键/类NetworkInterface

我能想到的一种解决方案是属性的属性,例如[ClassName],但我一直找不到。

【问题讨论】:

    标签: c# .net yaml yamldotnet sharpyaml


    【解决方案1】:

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

    Dictionary<string, Dictionary<string, Interface>>
    

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

    你有两个选择:

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

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

    【讨论】:

    • 没有想到要使用字典,我试试看,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多