最近在使用多语言,之前是使用资源文件实现,这次想看看有没有其他方案,最后发现了protobuf这个序列化/反序列化工具,谷歌的gRPC也是使用的这个序列化工具,据说是目前业界最快,序列化成文件体积最小的。
1.实体准备:
a.实体类使用ProtoContract特性标识,属性使用ProtoMember(n)标识(这个n,一般是随意写,不重复即可,但是建议从1开始写,依次递增)
b.注意:如果实体中嵌套的有实体,嵌套的实体也需要使用ProtoContract和ProtoMember(n)标识
using System.Collections.Generic;
using ProtoBuf;
namespace WebApiForInternational.Models
{
[ProtoContract]
public class LanguageInfo
{
[ProtoMember(1)]
public string Key { get; set; }
[ProtoMember(2)]
public List<LanguageValueInfo> Values { get; set; }
}
}
using ProtoBuf;
namespace WebApiForInternational.Models
{
[ProtoContract]
public class LanguageValueInfo
{
[ProtoMember(1)]
public string Type { get; set; }
[ProtoMember(2)]
public string Value { get; set; }
}
}
2.序列化为二进制文件:
//初始化多语言
var languageList = new List<LanguageInfo>()
{
new LanguageInfo()
{
Key = "Hello",
Values = new List<LanguageValueInfo>()
{
new LanguageValueInfo() {Type = "en_US", Value = "Hello"},
new LanguageValueInfo() {Type = "zh_CN", Value = "你好"}
}
},
new LanguageInfo()
{
Key = "SuccessMsg",
Values = new List<LanguageValueInfo>()
{
new LanguageValueInfo() {Type = "en_US", Value = "OperateSuccess"},
new LanguageValueInfo() {Type = "zh_CN", Value = "操作成功"}
}
},
new LanguageInfo()
{
Key = "ErrorMsg",
Values = new List<LanguageValueInfo>()
{
new LanguageValueInfo() {Type = "en_US", Value = "Program Error"},
new LanguageValueInfo() {Type = "zh_CN", Value = "程序发生异常"}
}
}
};
//存储为文件
var folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LanguageInfo");
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
using (var file = File.Create(Path.Combine(folderPath, "LanguageInfo.bin")))
{
ProtoBuf.Serializer.Serialize(file, languageList);
}
3.读取文件反序列化为泛型实体:
List<LanguageInfo> languageList = null;
//多语言文件路径
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "LanguageInfo", "LanguageInfo.bin");
//文件是否存在
if (!File.Exists(filePath))
{
return languageResultList;
}
//读取多语言文件
using (var file = File.OpenRead(filePath))
{
languageList = ProtoBuf.Serializer.Deserialize<List<LanguageInfo>>(file);
}
if (languageList == null || languageList.Count <= 0)
{
return languageResultList;
}
Ending~