我试图使用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?
作为参考,这里是dotnetfiddle.net的链接,显示问题:https://dotnetfiddle.net/jqVcL3
答案 0 :(得分:0)
由于没有答案,我会提供我的解决方法,而不是对我自己的问题的正确答案。
我通过逆向工程YamlDotNet代码进一步调查。在反向源中,有一个名为YamlDotNet\Core\Emitter.cs
的文件,其中包含方法WriteBlockScalarHints
。在该代码的某处,有一个对模式字符串"{0}\0"
的引用。根据我的理解,\0
只是毫无意义,如果没有它,整个代码将正常工作。
鉴于此,我在整个代码中查找了\0
的其他事件,并没有找到其他代码。
所以我认为这个\0
只是代码中的一个错字。
作为使代码工作的一种解决方法,我只是从输出中删除了\0
的每一次出现,并且它运行良好。
这是我在问题中发布的dotnetfiddle链接的一个分支的链接,其中包含以下解决方法:https://dotnetfiddle.net/fRnZPS(警告:此实现效率低,不应用于大型yaml)