2

配置.yaml:

App1:
  settings:
    redirectUrl: http://www.test.com
App2:
  settings:
    redirectUrl:
      test: http://www.test.com
      prod: http://www.prod.com

C# 对象

public class Config
 {
    public Dictionary<string, App> Apps { get; set; }
 }

public class App
 {
    public Dictionary<string, Setting> Settings { get; set; }
 }

public class Setting
 {
    public string Test {get;set;}
    public string Prod {get;set;}
 }

预期结果:

对于App1,testprod都是一样的http://www.test.com

对于App2,testhttp://www.test.com并且prodhttp://www.prod.com

我做了很多研究,但无法弄清楚如何通过使用自定义反序列化器来实现这一点。请帮忙..

4

1 回答 1

2

你可以让你的Settings班级实现IYamlConvertible。该接口允许您控制序列化过程。一个可能的实现可能是:

public class SettingsBase
{
    public string Test { get; set; }
    public string Prod { get; set; }
}

public class Setting : SettingsBase, IYamlConvertible
{
    public void Read(IParser parser, Type type, ObjectDeserializer nestedObjectDeserializer)
    {
        var scalar = parser.Allow<Scalar>();
        if (scalar != null)
        {
            Test = Prod = scalar.Value;
        }
        else
        {
            var values = (SettingsBase)nestedObjectDeserializer(typeof(SettingsBase));
            this.Test = values.Test;
            this.Prod = values.Prod;
        }
    }

    public void Write(IEmitter emitter, ObjectSerializer nestedObjectSerializer)
    {
        if (Test == Prod)
        {
            nestedObjectSerializer(Test);
        }
        else
        {
            nestedObjectSerializer(new SettingsBase { Test = this.Test, Prod = this.Prod });
        }
    }
}

在这里,我使用基类 ( SettingsBase) 作为一种轻松(反)序列化属性的方法,但可以使用另一种策略。基本上,该Read方法检查当前标记是否为标量。如果是这样,它使用它的值。否则,它将反序列化为SettingsBase. 该Write方法反其道而行之。

此处提供了一个完整的工作示例

于 2018-07-20T16:08:51.277 回答