写在前面
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上,进行频繁的网络传输比对时,是非常有价值的。