C# 使用protobuf序列化反序列化数据
protobuf是谷歌的一个序列化数据结构的协议,性能高,存储占用小
经过我的测试对比
1,最慢的是C#内置的BinaryFormatter,这个玩意能不用则不用
2,然后是json,用起来很方便,比BinaryFormatter快了1-2倍
3,接下来就是protobuf,不过需要给类的成员加上特性,相比json快了2-4倍
4,最快的是使用BinaryWriter和BinaryReader自己手动读写MemoryStream流,但是这个每次使用都要为每个类的字段手动写代码,很繁琐,比protobuf快了2-3倍
因此理论上来说protobuf-net是个很不错的序列化数据的手段,具体使用如下:
在nuget中安装protobuf-net
给要序列化的对象类型指定ProtoContract特性,还要给每个字段指定ProtoMember(tag),同一个类中的字段的tag不能冲突,如下
[ProtoContract] class Person { [ProtoMember(1)] public int Id { get; set; } [ProtoMember(2)] public string Name { get; set; } [ProtoMember(3)] public Address Address { get; set; } } [ProtoContract] class Address { [ProtoMember(1)] public string Line1 { get; set; } [ProtoMember(2)] public string Line2 { get; set; } }
然后调用protobuf-net的方法执行操作
public static class ProtobufHelper { public static (byte[], long) Serialize<T>(T obj) { using (MemoryStream ms = new MemoryStream()) { Serializer.Serialize(ms, obj); return (ms.GetBuffer(), ms.Length); } } public static T Deserialize<T>(byte[] buffer, int length) { using (MemoryStream ms = new MemoryStream(buffer, 0, length)) { return Serializer.Deserialize<T>(ms); } } }
protobuf-net兼容反序列化时模型字段不一致的情况,它应该是只对应ProtoMember的tag编号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)