YamlDo tNet: Сериализация / десериализация локального тега со скалярным значением - PullRequest
0 голосов
/ 06 апреля 2020

Может кто-нибудь сказать мне, как сериализовать это

Prop1: !MyTag my_value

Я могу десериализовать в простой тип, такой как

class MyTag
{
    public string TagValue { get; set; }
}

, но когда я сериализируюсь снова, я получаю

Prop1: !MyTag
  TagValue: my_value

Полный образец

void Main()
{
    using (var sr = new StreamReader(File.OpenRead(@"C:\Temp\mytag.yaml")))
    {
        var deserializer = new DeserializerBuilder()
                          .WithTypeConverter(new MyTagConverter())
                          .WithTagMapping("!MyTag", typeof(MyTag))
                          .Build();
        var yamlObject = deserializer.Deserialize(sr);

        yamlObject.Dump();
        var serializer = new SerializerBuilder().WithTagMapping("!MyTag", typeof(MyTag)).Build();
        var yaml = serializer.Serialize(yamlObject);
        Console.WriteLine(yaml);
    }
}

class MyTag
{
    public string TagValue { get; set; }
}

public class MyTagConverter: IYamlTypeConverter
{
    public bool Accepts(Type type)
    {
        return typeof(MyTag).IsAssignableFrom(type);
    }

    public object ReadYaml(IParser parser, Type type)
    {
        var target = parser.Consume<Scalar>();
        return new MyTag { TagValue = target.Value };
    }

    public void WriteYaml(IEmitter emitter, object value, Type type)
    {
        // Can't get anything sensible to be emitted here!
    }
}
...