YamlDotNet桌面端保留0x0D但Xamarin Android端丢失的问题求助
解决YamlDotNet跨平台生成许可证时Android端丢失0x0D的问题
问题根源是不同平台的换行符默认行为差异:Windows桌面端默认用CRLF(0x0D+0x0A),而Xamarin Android端默认用LF(0x0A),YamlDotNet的Save方法会依赖写入器的NewLine属性生成换行,导致两端输出不一致。
要强制在Android端保留0x0D字符,需要手动指定所有写入器的NewLine为"\r\n"(即CRLF),具体修改代码如下:
public void GenerateLicense() { var yamlStream = new YamlStream( new YamlDocument( new YamlMappingNode( new YamlScalarNode("XXXXXXXXXXXXXLic"), new YamlMappingNode( new YamlScalarNode("CustomerName"), new YamlScalarNode("Yo"), new YamlScalarNode("CustomerEmail"), new YamlScalarNode("yo@yo.yo"), new YamlScalarNode("HardwareID"), new YamlScalarNode("yo"), new YamlScalarNode("Signature"), new YamlScalarNode() ) ) ) ); string yaml; var buffer = new StringBuilder(); // 手动设置StringWriter的NewLine为CRLF using (var writer = new StringWriter(buffer) { NewLine = "\r\n" }) { yamlStream.Save(writer, false); yaml = writer.ToString(); } var checksum = StringToHex(MD5CheckSumStr(yaml)); var input = new StringReader(yaml); yamlStream = new YamlStream(); yamlStream.Load(input); var mapping = (YamlMappingNode)yamlStream.Documents[0].RootNode; ((YamlScalarNode)mapping.Children["XXXXXXXXXXXXXLic"]["Signature"]).Value = checksum; // 改用StreamWriter并指定NewLine为CRLF,替代File.CreateText using (var writer = new StreamWriter("../yo.yaml", false, Encoding.UTF8) { NewLine = "\r\n" }) { yamlStream.Save(writer, false); } }
关键修改点:
- 实例化
StringWriter时,显式设置NewLine = "\r\n",确保内存中生成的YAML字符串用CRLF换行。 - 保存到文件时,使用
StreamWriter替代File.CreateText,同样设置NewLine = "\r\n",强制写入文件时保留0x0D字符。
这样修改后,桌面端和Android端生成的许可证文件都会包含0x0D回车符,保证跨平台输出一致。
内容的提问来源于stack exchange,提问作者Freedom
相关产品推荐
相关产品推荐

