Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel-Tutorial für die Socket-Übertragung eines Protobuf-Byte-Streams

Beispiel-Tutorial für die Socket-Übertragung eines Protobuf-Byte-Streams

零下一度
零下一度Original
2017-06-23 16:15:172119Durchsuche

Urheberrechtserklärung: Dieser Artikel ist ein Originalartikel, bitte beim Nachdruck angeben

Ich arbeite derzeit an einem Schach- und Kartenprojekt und muss einen Socket verwenden, um Protobuf-Byte zu übertragen Ich habe einige Blogs gefunden und nach dem Lesen des Artikels festgestellt, dass er nicht besonders umfassend ist. Daher habe ich den gesamten Quellcode herausgenommen und mit allen geteilt zum Kommentieren~~

In diesem Artikel geht es hauptsächlich um die Serialisierung und Analyse von Protokollpufferdateien. Kommen wir ohne weitere Umschweife direkt zu den Grundlagen

 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 }

Jede Nachricht in der Protobuf-Datei kann in Klassen in c# konvertiert werden, z. B.

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

, nach der Konvertierung wird

 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   }

, Wenn Sie alle Codes mit global ignorieren, werden Sie feststellen, dass die konvertierte C#-Klasse genau mit einer Standard-C#-Entitätsklasse identisch ist und diese konvertierten Klassen alle von ProtoBuf.IExtensible erben, sodass der Parametertyp der obigen Serialisierungsfunktion IExtensible

ist

Bei der Serialisierung ist natürlich auch eine Deserialisierung erforderlich, d Das endgültige Objekt ist ein Objekt der von IExtensible geerbten Klasse, daher muss der Rückgabewert mithilfe allgemeiner Einschränkungen definiert werden, um die Vielseitigkeit der Funktion sicherzustellen

Nachdem das Tool fertig ist, besteht der nächste Schritt darin, den Code zu testen
 1     /// <summary> 2     /// 将收到的消息反序列化成IExtensible对象 3     /// </summary> 4     /// <param name="msg">收到的消息的字节流.</param> 5     /// <returns></returns> 6     public static T DeSerialize<T>(byte[] bytes) where T : IExtensible 7     { 8         try 9         {10             MemoryStream ms = new MemoryStream()11             //将消息写入流中12             ms.Write(bytes, 0, bytes.Length);13             //将流的位置归014             ms.Position = 0;15             //反序列化对象16             T result = Serializer.Deserialize<T>(ms);17             return result;18         }19         catch (Exception e)20         {21             Debug.Log("反序列化失败: " + e.ToString());22             return null;23         }24     }

Ausgabeergebnis 123456

Angehängte protobuf-net.dll-Datei
1     public void Test()2     {3         Test test = new Test() { test1 = "123", test2 = "456" };4         byte[] bytes = Serialize(test);5         Test test2 = DeSerialize<Test>(bytes);6         Debug.Log(test2.test1 + test2.test2);7     }

Vorkompilierungs- und Konvertierungstool


Das obige ist der detaillierte Inhalt vonBeispiel-Tutorial für die Socket-Übertragung eines Protobuf-Byte-Streams. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn