C# 操作Yaml文件

写在前面

Yaml 格式的配置文件简洁小巧,大概比json格式还要小三分之一,很多主流软件包括IDE都使用Yaml格式来做配置文件,日常开发的时候也可以利用其优点来存储序列化后的对象,下面介绍如何用C#来读写Yaml文件。

操作步骤

先通过NuGet 安装YamlDotNet, 这是一款比较流行的用来操作Yaml的.Net 类库。

操作代码示例:

var serializer = new SerializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
var deserializer = new DeserializerBuilder().WithNamingConvention(UnderscoredNamingConvention.Instance).Build();
var ymlFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "asset_table.yml");
if (File.Exists(ymlFile))
{
    var ymlContent = File.ReadAllText(ymlFile);
    var buildConfig = deserializer.Deserialize<BuildConfigFile>(ymlContent);
    if (buildConfig != null)
    {
        foreach (var item in buildConfig.assetBundles)
        {
            // 获取配置内容并修改
            // item.name
        }

        // 序列化成新的yaml文本并保存
        var newYamlContent = serializer.Serialize(buildConfig);
        File.WriteAllText(ymlFile, newYamlContent);
    }
}

 数据结构示例:

        public class BuildConfigFile
        {
            public class AssetBundleItem
            {
                [YamlMember(Alias = "name")]
                public string name { get; set; }

                [YamlMember(Alias = "size")]
                public long size { get; set; }

                [YamlMember(Alias = "variant")]
                public string variant { get; set; }

                [YamlMember(Alias = "version")]
                public long version { get; set; }

                [YamlMember(Alias = "md5")]
                public string md5 { get; set; }

                [YamlMember(Alias = "md5bytes")]
                public string md5bytes { get; set; }

                [YamlMember(Alias = "dependencies")]
                public string[] dependencies { get; set; }

                [YamlMember(Alias = "local")]
                public bool local { get; set; }

                [YamlMember(Alias = "assets")]
                public string[] assets { get; set; }
            }

            [YamlMember(Alias = "asset_bundles")]
            public List<AssetBundleItem> assetBundles { get; set; }
        }

Yaml操作工具类:

 

    public static class YamlHelper
    {
        private static ISerializer _serializer;
        private static IDeserializer _deserializer;

        static YamlHelper()
        {
            _serializer = new SerializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
            _deserializer = new DeserializerBuilder().WithNamingConvention(UnderscoredNamingConvention.Instance).Build();
        }

        public static string Serialize(object target)
        {
            return _serializer.Serialize(target);
        }

        public static void SerializeToFile(object target, string filePath)
        {
            var content = Serialize(target);
            File.WriteAllText(filePath, content, Encoding.UTF8);
        }

        public static T Deserialize<T>(string yaml)
        {
            return _deserializer.Deserialize<T>(yaml);
        }

        public static T DeserializeFromFile<T>(string filePath)
        {
            var yaml = File.ReadAllText(filePath, Encoding.UTF8);
            return Deserialize<T>(yaml);
        }
    }

 序列化的yaml文本示例:

 总结

在对空间敏感的使用场景,如需要放到cdn上,进行频繁的网络传输比对时,是非常有价值的。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中处理YAML文件需要使用一些第三方库,比如SnakeYAML。SnakeYAML是一种Java库,可用于读取YAML文件并将其转换为Java对象,反之亦然。 在SnakeYAML中,可以通过使用`DumperOptions`类来保留注释。具体步骤如下: 1. 导入SnakeYAML依赖 ```xml <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.29</version> </dependency> ``` 2. 读取YAML文件并保留注释 ```java import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.nodes.Tag; public class YamlParser { public static void main(String[] args) throws IOException { // 读取YAML文件 Yaml yaml = new Yaml(); FileInputStream inputStream = new FileInputStream("example.yaml"); Object obj = yaml.load(inputStream); // 设置DumperOptions保留注释 DumperOptions options = new DumperOptions(); options.setPrettyFlow(true); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); options.setAllowReadOnlyProperties(true); options.setExplicitStart(true); options.setExplicitEnd(true); options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN); options.setIndent(4); options.setWidth(80); options.setLineBreak(DumperOptions.LineBreak.getPlatformLineBreak()); options.setSplitLines(false); options.setCanonical(false); options.setTags(new Tag[0]); options.setExplicitTypes(false); options.setVersion(DumperOptions.Version.V1_2); options.setCheckImplicitResolvers(false); options.setAllowRecursiveKeys(true); options.setScalarAnalysis(DumperOptions.ScalarAnalysis.INCLUDE); options.setPrettyPrint(true); options.setIndent(2); options.setIndicatorIndent(0); options.setSplitLines(true); // 将Java对象写入YAML文件并保留注释 FileWriter writer = new FileWriter("example-out.yaml"); yaml.dump(obj, writer); } } ``` 在上面的示例中,我们使用了`DumperOptions`类来设置一些参数,以便在将Java对象写入YAML文件时保留注释。最后,我们使用`yaml.dump()`方法将Java对象写入新的YAML文件,并且注释得到保留。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值