yamldotnet序列化中输出yaml中的null char

时间:2016-02-28 11:20:12

标签: c# .net yamldotnet

我试图使用YamlDotNet库序列化一个结构,该结构可能包含以cariage返回开头的字符串。当我序列化数据时,我得到一个包含空字符的奇怪输出。

    using (var writer = new StringWriter())
    {
        var yaml = new YamlStream();
        var rootYamlNode = new YamlMappingNode();
        yaml.Add(new YamlDocument(rootYamlNode));

        rootYamlNode.Add("foo", "\nbar");
        yaml.Save(writer, false);
        Console.Write(writer.ToString());
        Console.Write(string.Join(", ", Encoding.UTF8.GetBytes(writer.ToString()).Select(b => string.Format("{0:X2}", b)).ToArray()));
    }

渲染为:

foo: >2?-

  bar
...
66, 6F, 6F, 3A, 20, 3E, 32, 00, 2D, 0D, 0A, 0D, 0A, 20, 20, 62, 61, 72, 0D, 0A, 2E, 2E, 2E, 0D, 0A

?使用空字符。 (十六进制序列是输出中编码为UTF-8的字节值)

有关信息,我使用Visual Studio 2008和框架3.5(和yamldotnet版本3.8.0这是迄今为止最新的,但带有框架4.5的dotnetfiddle.net显示与yamldotnet 3.8.0相同的问题)< / p>

它看起来像一个bug,但我可能误用了api。

  • 我的代码中是否有错误?

  • 如果它是yamldotnet中的一个错误,是否有办法通过要求yamldotnet使用"\nbar"语法而不是>- ...语法来格式化yaml?

    < / LI>

作为参考,这里是dotnetfiddle.net的链接,显示问题:https://dotnetfiddle.net/jqVcL3

1 个答案:

答案 0 :(得分:0)

由于没有答案,我会提供我的解决方法,而不是对我自己的问题的正确答案。

我通过逆向工程YamlDotNet代码进一步调查。在反向源中,有一个名为YamlDotNet\Core\Emitter.cs的文件,其中包含方法WriteBlockScalarHints。在该代码的某处,有一个对模式字符串"{0}\0"的引用。根据我的理解,\0只是毫无意义,如果没有它,整个代码将正常工作。

鉴于此,我在整个代码中查找了\0的其他事件,并没有找到其他代码。

所以我认为这个\0只是代码中的一个错字。

作为使代码工作的一种解决方法,我只是从输出中删除了\0的每一次出现,并且它运行良好。

这是我在问题中发布的dotnetfiddle链接的一个分支的链接,其中包含以下解决方法:https://dotnetfiddle.net/fRnZPS(警告:此实现效率低,不应用于大型yaml)