0

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

    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

4

1 回答 1

0

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

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

\0鉴于此,我在整个代码中寻找其他出现的,但没有找到其他出现。

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

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

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

于 2016-03-05T09:34:54.710 回答