Tutoriel d'exemple de flux d'octets protobuf de transmission de socket

零下一度
Libérer: 2017-06-23 16:15:17
original
2118 Les gens l'ont consulté

Déclaration de copyright : Cet article est un article original, veuillez le déclarer lors de la réimpression

Je travaille actuellement sur un projet d'échecs et de cartes et j'ai besoin d'utiliser socket pour transmettre l'octet protobuf stream. J'ai trouvé quelques blogs et après avoir lu l'article, j'ai trouvé qu'il n'était pas particulièrement complet, alors j'ai sorti tout le code source que j'ai recherché et je l'ai partagé avec tout le monde. Parce que je viens de commencer à le faire, il peut y avoir des lacunes. pour commenter~~

Cet article porte principalement sur la sérialisation et l'analyse des fichiers tampon de protocole, sans plus tarder, passons directement aux choses pratiques

 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 }
Copier après la connexion

Chacun Le message dans le fichier protobuf peut être converti en classes en c#, telles que

message Test {
    required string test1= 1;
    required string test2= 2;
}
Copier après la connexion

, après conversion, devenir

 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   }
Copier après la connexion

, en ignorant tous les codes avec global , vous constaterez que la classe C# convertie est exactement la même qu'une classe d'entité C# standard, et ces classes converties héritent toutes de ProtoBuf.IExtensible, donc le type de paramètre de la fonction de sérialisation ci-dessus est IExtensible

Avec la sérialisation, bien sûr, la désérialisation est également nécessaire, c'est-à-dire que byte[] est désérialisé en un objet d'un type hérité de IExtensible

 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     }
Copier après la connexion

En raison de la désérialisation L'objet final est un objet de la classe héritée de IExtensible, la valeur de retour doit donc être définie à l'aide de contraintes génériques pour garantir la polyvalence de la fonction

Une fois l'outil terminé, l'étape suivante consiste à tester le code

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     }
Copier après la connexion

Résultat de sortie 123456

Fichier protobuf-net.dll ci-joint


Outil de précompilation et de conversion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!