ホームページ >バックエンド開発 >C#.Net チュートリアル >ソケット送信 protobuf バイト ストリームのサンプル チュートリアル

ソケット送信 protobuf バイト ストリームのサンプル チュートリアル

零下一度
零下一度オリジナル
2017-06-23 16:15:172140ブラウズ

著作権声明: この記事はオリジナルの記事です、転載する際は宣言してください

私は現在チェスとカードのプロジェクトに取り組んでおり、いくつかのブログと記事を検索した後、protobuf バイトストリームを送信するためにソケットを使用する必要があります。インターネット、特に包括的なものがないことがわかったので、私が調べたすべてのソースコードを取り出して、皆さんと共有します。まだやり始めたばかりなので、いくつかの不備があるかもしれません。コメント大歓迎です~~

この記事は主にプロトコル バッファー ファイルのシリアル化と解析についてです。これ以上のナンセンスはありません。直接、乾いた情報にアクセスしてください。protobuf ファイル内の各メッセージは、ProtoGen ツールを使用して C# のクラスに変換できます。たとえば、

 1 /// <summary> 2 /// 将消息序列化为二进制的方法 3 /// </summary> 4 /// <param name="model">要序列化的对象</param> 5 public static byte[] Serialize(IExtensible model) 6 { 7   try 8   { 9     //创建流对象10     MemoryStream ms = new MemoryStream()11     //使用ProtoBuf自带的序列化工具序列化IExtensible对象12     Serializer.Serialize<IExtensible>(ms, model);13     //创建二级制数组,保存序列化后的流14     byte[] bytes = new byte[ms.Length];15     //将流的位置设为016     ms.Position = 0;17     //将流中的内容读取到二进制数组中18     ms.Read(bytes, 0, bytes.Length);19     return bytes;20   }21   catch (Exception e)22   {23     Debug.Log("序列化失败: " + e.ToString());24     return null;25   }26 }

変換後は

message Test {
    required string test1= 1;
    required string test2= 2;
}

になります。 global を含むコードをすべて無視すると、変換された C# クラスは標準の C# エンティティ クラスとまったく同じであることがわかります。そして、これらの変換されたクラスは ProtoBuf.IExtensible を継承するため、上記のシリアル化関数のパラメーターの型は次のとおりです。 IExtensible です

シリアル化では、もちろん逆シリアル化する必要があります。つまり、byte[] はある型のオブジェクトに逆シリアル化されます。 IExtensible

 1   [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"SedReq")] 2   public partial class Test : global::ProtoBuf.IExtensible 3   { 4     public Test() {} 5      6     private string _test1; 7     [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"test1", DataFormat = global::ProtoBuf.DataFormat.Default)] 8     public string test1 9     {10       get { return _test1; }11       set { _test1 = value; }12     }    
13     private string _test2;14     [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"test2", DataFormat = global::ProtoBuf.DataFormat.Default)]15     public string test216     {17       get { return _test2; }18       set { _test2 = value; }19     }20     private global::ProtoBuf.IExtension extensionObject;21     global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)22       { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }23   }

から継承されているため、逆シリアル化されたオブジェクトは IExtensible Class オブジェクトから継承されているため、関数の汎用性を確保するために戻り値を定義する必要があります。ツールが完了したら、次のステップを実行します。コードをテストするには、ファイル

プリコンパイルおよび変換ツール

を使用します。

以上がソケット送信 protobuf バイト ストリームのサンプル チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。