C# 使用protobuf序列化反序列化数据

发布时间 2024-01-08 17:18:46作者: WmW

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);
            }
        }
    }