寻找可保留非语义格式的YAML DOM解析与序列化开源库
满足需求的C# YAML开源库推荐
1. YamlDotNet(启用格式保留模式)
YamlDotNet是C#生态中应用广泛的YAML库,默认序列化会丢失格式细节,但通过DOM模型结合格式保留配置,可实现完整的非语义信息留存:
- 解析时用
YamlStream.Load()加载完整文档,保留注释、空白行、节点顺序、多行字符串样式等所有格式元数据 - 基于
MappingNode/ScalarNode等DOM节点结构修改配置内容 - 序列化时通过
Save()方法的参数禁用自动格式化,严格复现原文件格式 - 原生支持YAML v1.2,兼容JSON子结构解析
核心代码片段:
// 加载原配置,保留所有格式信息 var yamlStream = new YamlStream(); using var reader = new StreamReader("config.yaml"); yamlStream.Load(reader); // 操作DOM节点修改配置 var root = (MappingNode)yamlStream.Documents[0].RootNode; root["new_config_item"] = new ScalarNode("custom_value"); // 保存时保留原格式 using var writer = new StreamWriter("config.yaml"); yamlStream.Save(writer, false); // false参数禁用自动格式化
2. NetYAML
NetYAML是专为格式保留设计的轻量YAML库,全程基于DOM模型,原生支持往返过程中完整留存非语义内容:
- 解析时会记录每个节点的注释位置、空白换行、缩进规则等细节
- 序列化时严格复刻原文件的格式表现,包括多行字符串的换行方式、注释的排版
- API简洁直观,无需额外配置即可实现格式无损往返
核心代码片段:
// 解析配置文件,保留格式元数据 var yamlMap = NetYaml.Deserialize<YamlMapping>("config.yaml"); // 修改配置节点 yamlMap["existing_setting"] = new YamlScalar("updated_value"); // 保存时完全保留原格式 NetYaml.Serialize("config.yaml", yamlMap);
关键注意事项
- 必须使用DOM节点模型操作配置,禁止使用基于POCO对象的序列化/反序列化,否则会丢失格式信息
- 测试时需覆盖所有场景:多行字符串、前后空白行、行内/块级注释、JSON子结构等,确保往返后文件内容无差异
内容的提问来源于stack exchange,提问作者Knowleech
相关产品推荐
相关产品推荐

