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。
我的代码中是否存在错误?
如果它是 yamldotnet 中的错误,有没有办法通过要求 yamldotnet 使用 "\nbar"
语法而不是 >- ...
语法来格式化 yaml?
作为参考,这里是 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)
我正在尝试使用 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。
我的代码中是否存在错误?
如果它是 yamldotnet 中的错误,有没有办法通过要求 yamldotnet 使用
"\nbar"
语法而不是>- ...
语法来格式化 yaml?
作为参考,这里是 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)