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

本文关键字:字符 yaml 输出 yamldotnet 序列化 | 更新日期: 2023-09-27 18:36:31

我正在尝试使用 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 的输出中的字节值)

有关信息,我正在使用带有框架 3.5 的 Visual Studio 2008(以及迄今为止最新的 yamldotnet 版本 3.8.0,但框架 4.5 的 dotnetfiddle.net 显示了与 yamldotnet 3.8.0 相同的问题)

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

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

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

作为参考,这里有一个指向显示问题的 dotnetfiddle.net 的链接: https://dotnetfiddle.net/jqVcL3

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

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

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

鉴于此,我在整个代码中查找了其他'0,但没有找到其他出现。

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

作为使我的代码正常工作的解决方法,我只是从输出中删除了每次出现的'0,并且效果很好。

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