C#使用protobuf

來源:互聯網
上載者:User

標籤:base   log   efault   formatter   test   ret   value   設定   type   

C# protobuf的使用方法

簡介 
Protobuf是google提供的一個開源序列化架構,類似於XML,JSON這樣的資料表示語言。 
支援多種程式設計語言,現:Java、c#、c++、Go 和 Python。 
基於二進位,因此比傳統的XML表示高效短小得多 
作為一種效率和相容性都很優秀的位元據傳輸格式,可以用於諸如網路傳輸、設定檔、資料存放區等諸多領域。 
使用

1、:http://code.google.com/p/protobuf/downloads/2、proto檔案格式

package 對應於c#中的命名空間 
required 對應類的屬性 
optional 建立一個具有預設值的屬性,通過[default=XXX]設定預設值,不添加預設為空白置。如string預設為“”,int預設為0 
enum 建立枚舉 
message 建立自訂類或內部類 
repeated 對應list列表資料 
proto資料類型: 
 
樣本:

package test;message Person {    required string name=1;    required int32 id=2;    optional string email=3 ;    enum PhoneType {        MOBILE=0;        HOME=1;        WORK=2;    }    message PhoneNumber {        required string number=1;        optional PhoneType type=2 [default=HOME];    }    repeated PhoneNumber phone=4;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

proto檔案編輯的命令: 
protogen -i:input.proto -o:output.cs 
protogen -i:input.proto -o:output.xml -t:xml 
protogen -i:input.proto -o:output.cs -p:datacontract -q 
protogen -i:input.proto -o:output.cs -p:observable=true

轉換之後的檔案:

//------------------------------------------------------------------------------// <auto-generated>//     This code was generated by a tool.////     Changes to this file may cause incorrect behavior and will be lost if//     the code is regenerated.// </auto-generated>//------------------------------------------------------------------------------// Generated from: input/test.protonamespace input.test{  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"Person")]  public partial class Person : global::ProtoBuf.IExtensible  {    public Person() {}    private string _name;    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"name", DataFormat = global::ProtoBuf.DataFormat.Default)]    public string name    {      get { return _name; }      set { _name = value; }    }    private int _id;    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"id", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]    public int id    {      get { return _id; }      set { _id = value; }    }    private string _email = "";    [global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"email", DataFormat = global::ProtoBuf.DataFormat.Default)]    [global::System.ComponentModel.DefaultValue("")]    public string email    {      get { return _email; }      set { _email = value; }    }    private readonly global::System.Collections.Generic.List<Person.PhoneNumber> _phone = new global::System.Collections.Generic.List<Person.PhoneNumber>();    [global::ProtoBuf.ProtoMember(4, Name=@"phone", DataFormat = global::ProtoBuf.DataFormat.Default)]    public global::System.Collections.Generic.List<Person.PhoneNumber> phone    {      get { return _phone; }    }  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"PhoneNumber")]  public partial class PhoneNumber : global::ProtoBuf.IExtensible  {    public PhoneNumber() {}    private string _number;    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"number", DataFormat = global::ProtoBuf.DataFormat.Default)]    public string number    {      get { return _number; }      set { _number = value; }    }    private Person.PhoneType _type = Person.PhoneType.HOME;    [global::ProtoBuf.ProtoMember(2, IsRequired = false, Name=@"type", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]    [global::System.ComponentModel.DefaultValue(Person.PhoneType.HOME)]    public Person.PhoneType type    {      get { return _type; }      set { _type = value; }    }    private global::ProtoBuf.IExtension extensionObject;    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }  }    [global::ProtoBuf.ProtoContract(Name=@"PhoneType")]    public enum PhoneType    {      [global::ProtoBuf.ProtoEnum(Name=@"MOBILE", Value=0)]      MOBILE = 0,      [global::ProtoBuf.ProtoEnum(Name=@"HOME", Value=1)]      HOME = 1,      [global::ProtoBuf.ProtoEnum(Name=@"WORK", Value=2)]      WORK = 2    }    private global::ProtoBuf.IExtension extensionObject;    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
3、proto轉化後的.cs檔案的序列化和還原序列化

首先,將產生的.cs檔案複製到自己的專案檔中 
然後添加動態連結程式庫檔案protobuf-net.dll(該檔案位於下載的proto檔案的protobuf-net_r668\ProtoGen目錄下) 
然後在程式中引用,相關程式如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using ProtoBuf;using input.test;using System.IO;using System.Runtime.Serialization.Formatters.Binary;namespace test1{    class Program    {        static void Main(string[] args)        {            Person p = new Person();            p.name = "zhang san";            p.email = "[email protected]";            p.id = 12;            //序列化操作            MemoryStream ms=new MemoryStream();            //BinaryFormatter bm = new BinaryFormatter();            //bm.Serialize(ms, p);            Serializer.Serialize<Person>(ms, p);            byte[] data = ms.ToArray();//length=27  709            //還原序列化操作            MemoryStream ms1 = new MemoryStream(data);           // BinaryFormatter bm1 = new BinaryFormatter();           //Person p1= bm.Deserialize(ms1) as Person;            Person p1 = Serializer.Deserialize<Person>(ms1);           Console.ReadKey();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  

C#使用protobuf

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.