protobuf的使用

最近在使用多语言,之前是使用资源文件实现,这次想看看有没有其他方案,最后发现了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~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值