YamlDotNet !!二进制类型

2024-02-21

我正在尝试使用 yaml 发送二进制数据,即字节数组。根据yaml文档,Yaml 二进制类型 http://yaml.org/type/binary.html,这是支持的。在 Java 端,我使用 SnakeYaml,如果传递了 byte[] 值,则 yaml 会正确给出 !!binary。

YamlDotNet 中似乎不支持“开箱即用”的此功能。下面的代码片段创建了一个整数值序列:

IDictionary<string, object> data = new Dictionary<string, object>();

        const string value = ":| value: <XML> /n\n C:\\cat";
        byte[] bytes = Encoding.UTF8.GetBytes(value);
        data.Add(ValueKey, bytes);


        // Turn the object representation into text
        using (var output = new StringWriter())
        {
            var serializer = new Serializer();
            serializer.Serialize(output, data);

            return output.ToString();
        }

输出如下:

val:\r- 58\r- 124\r- 32\r- 118\r- 97\r- 108\r- 117\r- 101\r- 58\r- 32\r- 60\r- 88\r- 77\r- 76\r- 62\r- 32\r- 47\r- 110\r- 10\r- 32\r- 67\r- 58\r- 92\r- 99\r- 97\r- 116\r

但我想要更多类似的东西:

  val: !!binary |-
OnwgdmFsdWU6IDxYTUw+IC9uCiBDOlxjYXQ=

谁能推荐一个解决方法?


添加对自定义类型的支持的首选方法是使用自定义IYamlTypeConverter https://github.com/aaubry/YamlDotNet/blob/master/YamlDotNet/Serialization/IYamlTypeConverter.cs。一个可能的实现!!binary类型为:

public class ByteArrayConverter : IYamlTypeConverter
{
    public bool Accepts(Type type)
    {
        // Return true to indicate that this converter is able to handle the byte[] type
        return type == typeof(byte[]);
    }

    public object ReadYaml(IParser parser, Type type)
    {
        var scalar = (YamlDotNet.Core.Events.Scalar)parser.Current;
        var bytes = Convert.FromBase64String(scalar.Value);
        parser.MoveNext();
        return bytes;
    }

    public void WriteYaml(IEmitter emitter, object value, Type type)
    {
        var bytes = (byte[])value;
        emitter.Emit(new YamlDotNet.Core.Events.Scalar(
            null,
            "tag:yaml.org,2002:binary",
            Convert.ToBase64String(bytes),
            ScalarStyle.Plain,
            false,
            false
        ));
    }
}

要使用转换器Serializer,您只需使用以下代码进行注册:

var serializer = new Serializer();
serializer.RegisterTypeConverter(new ByteArrayConverter());

For the Deserializer,还需要注册转换器,但是还需要添加标签映射来解析!!binary标记到byte[] type:

var deserializer = new Deserializer();
deserializer.RegisterTagMapping("tag:yaml.org,2002:binary", typeof(byte[]));
deserializer.RegisterTypeConverter(new ByteArrayConverter());

可以在这里尝试一个完整的工作示例 https://dotnetfiddle.net/1plIcc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YamlDotNet !!二进制类型 的相关文章

随机推荐