yaml序列化注意事项

 

 

不能有特殊字符

 如   %YAML:1.0

报错如下:

directives end mark is expected at line 3, column 1:
TmpFile: 0
^

 

其实真正的出错是  %YAML:1.0 ,将其修正为 YAML: 1.0  即可。

修正后如下图:

 

 

 

转义字符要特别注意

  ImageOrientation: "1\0\0\0\1\0 " 

  如上这样,是会报错的;原因是为因为  \1  是特殊字符,详细可自行了解。

 报错如下:

unknown escape sequence at line 70, column 28:
ImageOrientation: "1\0\0\0\1\0 "

 

修正后如下:

 

 

自行验证yaml链接:YAML、YML在线编辑器(格式化校验)-开发者工具

 

推荐操作

 

Yaml的操作最好是以对象来进行操作,而不是使用字符串匹配或正则表达式进行匹配。

以对象操作,可以校验相应字符串的正确性,并且能保证以yaml要求的写入规则进行写入,如此可避免由写入不规则造成读取时出现异常。

 

在C#开发中推荐使用YamlDotNet来进行相应的操作。

 

以下为以YamlDotNet更新Yaml数据,以键值对进行操作的示例,供参考。

 public static void UpdateYamlValue(string yamlPath, Dictionary<string, object> keyValues)
 {
     if (File.Exists(yamlPath))
     {
         string fileTxt = File.ReadAllText(yamlPath);
         var deserializer = new DeserializerBuilder()
            .WithNamingConvention(CamelCaseNamingConvention.Instance)
            .Build();
         // Assuming the YAML deserializes to a Dictionary<string, object>
         var yamlData = deserializer.Deserialize<Dictionary<string, object>>(new StringReader(fileTxt));
         foreach (var kv in keyValues)
         {
             yamlData[kv.Key] = kv.Value;
         }
         // Serialize back to YAML
         var serializer = new SerializerBuilder()
            .WithNamingConvention(CamelCaseNamingConvention.Instance)
            .Build();

         string updatedYaml = serializer.Serialize(yamlData);

         // Write back to file
         File.WriteAllText(yamlPath, updatedYaml);
     }
     else
     {
         NlogHelper.Logger.Info(String.Format("{0}路径不存在!", yamlPath));
     }
 }

 

 

YamlDotNet文档参考链接:Home · aaubry/YamlDotNet Wiki · GitHub

 

posted @ 2025-06-27 11:27  盛沧海  阅读(22)  评论(0)    收藏  举报