yamldotnet 序列化中输出 yaml 中的空字符

null char in output yaml in yamldotnet serialization

我正在尝试使用 YamlDotNet 库序列化一个结构,该结构可能包含以马车开头的字符串 return。当我序列化数据时,我得到一个包含空字符的奇怪输出。

    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,这是迄今为止最新的,但是 dotnetfiddle.net 框架 4.5 显示与 yamldotnet 相同的问题3.8.0)

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

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

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

我通过逆向工程 YamlDotNet 代码进一步调查。在反向源中,有一个名为 YamlDotNet\Core\Emitter.cs 的文件包含一个方法 WriteBlockScalarHints。在该代码的某处,有对模式字符串 "{0}[=12=]" 的引用。据我了解, [=13=] 没有任何意义,没有它整个代码也能正常工作。

鉴于此,我在整个代码中寻找其他出现的 [=13=],但没有找到其他出现的地方。

所以我假设这个 [=13=] 只是代码中的错字。

作为使我的代码正常工作的解决方法,我只是从输出中删除了每次出现的 [=13=],它运行良好。

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