首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YamlDotNet!二进制类型

YamlDotNet!二进制类型
EN

Stack Overflow用户
提问于 2016-06-03 16:59:58
回答 2查看 1.4K关注 0票数 2

我试图使用yaml发送二进制数据,即字节数组。根据yaml文档Yaml二进制型,这是支持的。在Java方面,我使用SnakeYaml,如果传递byte[]值,则yaml将正确地给出!!二进制。

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

代码语言:javascript
复制
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();
        }

产出如下:

代码语言:javascript
复制
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

但我想要的更像是:

代码语言:javascript
复制
  val: !!binary |-
OnwgdmFsdWU6IDxYTUw+IC9uCiBDOlxjYXQ=

有人能推荐一个解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-16 14:37:19

添加对自定义类型的支持的首选方法是使用自定义IYamlTypeConverter!!binary类型的一个可能实现是:

代码语言:javascript
复制
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中使用转换器,只需使用以下代码注册它:

代码语言:javascript
复制
var serializer = new Serializer();
serializer.RegisterTypeConverter(new ByteArrayConverter());

对于Deserializer,还需要注册转换器,但还需要添加标记映射以将!!binary标记解析为byte[]类型:

代码语言:javascript
复制
var deserializer = new Deserializer();
deserializer.RegisterTagMapping("tag:yaml.org,2002:binary", typeof(byte[]));
deserializer.RegisterTypeConverter(new ByteArrayConverter());

这里可以尝试一个完全工作的示例。

票数 1
EN

Stack Overflow用户

发布于 2016-06-06 13:32:39

对任何感兴趣的人来说..。我自己创建了字符串,添加了!!二进制标记,并进行了一些清理,从而修复了这个问题。下面是密码。

ToYaml:

代码语言:javascript
复制
IDictionary<string, string> data = new Dictionary<string, string>();
string byteAsBase64Fromat = Convert.ToBase64String("The string to convert");
byteAsBase64Fromat = "!!binary |-\n" + byteAsBase64Fromat + "\n";

data.Add(ValueKey, byteAsBase64Fromat);
string yaml;
using (var output = new StringWriter())
{
  var serializer = new Serializer();
  serializer.Serialize(output, data);

   yaml = output.ToString();
}
string yaml = yaml.Replace(">", "");
return yaml.Replace(Environment.NewLine + Environment.NewLine,     Environment.NewLine);

然后回来:

代码语言:javascript
复制
string binaryText = ((YamlScalarNode)data.Children[new YamlScalarNode(ValueKey)]).Value
String value = Convert.FromBase64String(binaryText);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37619841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档