码迷,mamicode.com
首页 > 其他好文 > 详细

Protobuf

时间:2019-08-14 16:41:46      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:ref   stream   col   mes   name   namespace   代码   blank   mode   

主要分2种

P1:Google.Protobuf:分v2和v3;

V3的类型对照表,地址见这里

V2的类型对照表,见这里

 

V3的用法

1、NET4.5的项目,安装Nuget包<Google.Protobuf>和<Google.Protobuf.Tools>

2、编写proto文件,类型参照上文定义;放一个demo.proto

syntax = "proto3";
package protobuf_unittest_import;
option csharp_namespace = "Export.DAL";

message ListFloat
{
repeated float items =1;
}

message CircleInfoBuf
    {
         int32 No =1;
         string Name =2;
         float Diameter =3;
         float Length =4;
         ListFloat Points =5;
    }

3、运行\packages\Google.Protobuf.Tools.3.9.1\tools\windows_x64下的protoc.exe,执行命令,转成cs代码;

protoc.exe --proto_path=所在目录 --csharp_out=生成的目录   demo.proto 

4、引用此cs文件,编写其他代码

5、序列化和反序列化

序列化

            string bufFile = "";
            using (FileStream fs = new FileStream(bufFile, FileMode.CreateNew))
            {
                using (CodedOutputStream cos = new CodedOutputStream(fs))
                {
                    list.WriteTo(cos);//需序列化的对象
                    fs.Flush();
                }
            }

反序列化

            using (FileStream fs = new FileStream(bufFile, FileMode.Open))
            {
                using (CodedInputStream cos = new CodedInputStream(fs))
                {
                    CircleInfoBuf list = CircleInfoBuf.Parser.ParseFrom(cos);
                    return list;
                }
            }

 

P2:protobuf-net

1、定义类

 

 [ProtoContract]
 public class CircleInfo
    {
        [ProtoMember(1)]
        public int No { get; set; }
        [ProtoMember(2)]
        public string Name { get; set; }
        [ProtoMember(3)]
        public float Diameter { get; set; }
        [ProtoMember(4)]
        public float Length { get; set; }
        [ProtoMember(5)]
        public float[] Points { get; set; }
    }

 序列化

            string bufFile = "";
            using (FileStream fs = new FileStream(bufFile, FileMode.OpenOrCreate))
            {
                ProtoBuf.Serializer.Serialize(fs, list);//需要序列化的对象
                fs.Flush();
            }

反序列化

        T Load<T>(string bufFile)
        {
            T list = default(T);
            using (FileStream fs = new FileStream(bufFile, FileMode.Open))
            {
                list = ProtoBuf.Serializer.Deserialize<T>(fs);
            }
            return list;
        }

------------------------------

对比性能测试Google.Protobuf(3.9.1.0)、.protobuf(2.4.0.0)-net和Json(Newtonsoft.Json 12.0.0.0),

序列化和反序列化的时间

Google.Protobuf > protobuf-net > Json

------------------------------

Protobuf

标签:ref   stream   col   mes   name   namespace   代码   blank   mode   

原文地址:https://www.cnblogs.com/feedback/p/11352520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!