소켓 전송 protobuf 바이트 스트림 예제 튜토리얼

零下一度
풀어 주다: 2017-06-23 16:15:17
원래의
2118명이 탐색했습니다.

저작권 설명: 이 기사는 원본 기사입니다. 재인쇄 시 신고해 주세요.

현재 인터넷에서 일부 블로그와 기사를 검색한 후 소켓을 사용하여 protobuf 바이트 스트림을 전송해야 하는 체스 및 카드 프로젝트를 진행하고 있습니다. , 특별히 포괄적인 내용은 없는 것으로 확인되어 제가 조사한 소스 코드를 모두 꺼내어 공유하겠습니다. 이제 막 시작했기 때문에 부족한 부분이 있을 수 있으니 댓글 환영합니다~~

이 글은 주로 프로토콜 버퍼 파일의 직렬화와 파싱에 관한 것이므로 너무 장황한 내용은 다루지 않겠습니다. , 바로 내용으로 들어가겠습니다

 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 }
로그인 후 복사

protobuf 파일의 각 메시지는 클래스로 변환될 수 있습니다. 프로토콜 버퍼에서 제공하는 ProtoGen 도구를 통해 C#을 사용합니다. 예를 들어

message Test {
    required string test1= 1;
    required string test2= 2;
}
로그인 후 복사

변환 후에는

 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   }
로그인 후 복사

가 됩니다. global로 모든 코드를 무시하면 변환된 C# 클래스가 a와 완전히 동일하다는 것을 알 수 있습니다. 표준 C# 엔터티 클래스이며 이러한 변환된 클래스는 모두 ProtoBuf.IExtensible에서 상속되므로 위 직렬화 함수의 매개 변수 유형은 IExtensible입니다

직렬화를 사용하면 당연히 역직렬화해야 합니다. 즉, byte[]가 역직렬화됩니다. 역직렬화된 개체는 IExtensible 클래스 개체에서 상속되기 때문에 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     }
로그인 후 복사

에서 상속된 유형의 개체로 변환되므로 도구가 완료된 후 일반 제약 조건을 사용하여 반환 값을 정의해야 합니다. 다음 단계는 파일

사전 컴파일 및 변환 도구

를 테스트하는 것입니다.

위 내용은 소켓 전송 protobuf 바이트 스트림 예제 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!