unity探索者之socket传输protobuf字节流(一)

2019-10-18 14:47 来源:未知

 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 test2
16     {
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#类和八个正式的c#实体类一模二样,並且,这一个转账后的类都承继至ProtoBuf.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             //将流的位置归0
14             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     }

出口结果  123456

多年来在做三个棋牌项目,必要用到socket传输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     //将流的位置设为0
16     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 }

工具解决,接下去就是测验代码了

因为反系列化后的目的是持续至IExtensible的类的靶子,所以重回值必得使用泛型约束来定义,这样才具保险函数的通用性

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     }

附上protobuf-net.dll文件

protobuf文件中的每一条message经过protocol buffer提供的ProtoGen工具得以转成c#的中的类,举个例子

版权证明:正文为原创小说,转载请宣示 

预编写翻译和中间转播工具

有了体系化,当然还须求反类别化,也正是讲byte[]反种类化为承袭至IExtensible的等级次序的对象

这一篇首倘使protocol buffer文件的体系化和解析,废话非常少说了,直接上干货

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

通过转变后就成为了

TAG标签:
版权声明:本文由澳门新葡亰娱乐在线发布于葡亰_棋牌,转载请注明出处:unity探索者之socket传输protobuf字节流(一)