游戏前端,避免不了的跟服务器通讯,其实游戏的大部分逻辑都在服务端,并不在客户端,所以需要跟服务端通讯“协商”一些逻辑,既然通讯,就少不了的传输,传输之前又要序列化,这篇博客主要讲一下Int类型数据的序列化以及反序列化。
这是我博客新开的一个类别,这个类别主要讲前端与服务器的通讯原理和过程,以及实现方法,我会慢慢更新,直至更新完毕,都在学习,有什么问题可以大家一块商讨,一起解决问题!
Unity前端,主要语言是C#,当然也有用lua的,方便热更新,今天说的是C#先把基础的C#给搞明白,有前端就要有后端,后端语言很多种,这里我说的是Java,其他语言大差不差,基本原理都一样,掌握了这个一个基本上与服务器通讯不是什么难题。
首先C#与Java之间的序列化是相反的,比如序列化一个int类型的数,这个数是90,前端C#写法是这样的:
using UnityEngine;
using System.IO;
using System.Collections.Generic;
using System;
using UnityEngine.UI;
/// <summary>
/// 序列化int类型的数据并打印
/// </summary>
public class Test : MonoBehaviour {
private List<byte> bytes = new List<byte>();
void Start()
{
Debug.Log("序列化int类型的数据");
ToArray(90);
}
void ToArray(int a)
{
byte[] bs = BitConverter.GetBytes(a);
//此句为反转这个int类型的数据,以便与Java端通讯
//Array.Reverse(bs);
this.bytes.AddRange(bs);
foreach (byte str in bytes)
{
//由于int类型的数据占用4个字节 所以输出为:A , 0 ,0 ,0;
Debug.Log(str);
}
}
}
这个脚本你会看到第21行有个注释,这一句很重要,我先注释,然后看一下输出是这样的:
输出结果为:90,0,0,0
这样的输出结果本身是没错的,但是在Java端的结果正好是相反的,Java的结果是0,0,0,90;
所以必须要处理一下该数据,这个东西前端或者后端处理都可以,不过后端处理起来比较麻烦,所以我在前端就处理了就是哪个第21行的注释,如果加上注释,输出结果正好相反,如下图所示:
在C#中,反转数据只需要一句话,但是在Java中比较麻烦,所以建议前端反转该数据,反转只需要将第21行的代码注释去掉即可
或这加上:
Array.Reverse(bs);
但是string类型的数据是无需反转的,这一点需要记住了!
即可完成,当然这只是前奏,这样写会很麻烦,我们要做一个管理类,这样用起来就会方便很多,每次序列化或者反序列化都可以从这个管理类里面经过,然后展现出来。
所以要在项目中新建一个类,名字叫做 ByteBuf
首先删除命名空间,建立一个私有的list 这个list用来接住发过来的东西,然后私有一个长度和坐标,不多说,看下面的脚本:
using System; using System.Collections.Generic; using System.Linq; using System.Text; /// <summary> /// int类型的序列化和反序列化 /// </summary> public class ByteBuf{ private List<byte> bytes = new List<byte>(); private int length; private int position; public int Length { get { return length; } set { length = value; } } public int Position { get { return position; } set { position = value; } } /// <summary> /// 写int类型的数据(序列化) /// </summary> /// <param 长度="valve"></param> public void WriteInt(int valve) { byte[] by = BitConverter.GetBytes(valve); Array.Reverse(by); this.bytes.AddRange(by); } /// <summary> /// 读int类型的数据(反序列化) /// </summary> /// <returns></returns> public int ReadInt() { byte[] array = new byte[4]; for (int i = 0; i < 4; i++) { array[i] = this.bytes[i + this.Position]; } Position += 4; Array.Reverse(array); return BitConverter.ToInt32(array, 0); } }
这样的话就可以来用这个方法直接序列化或者反序列化了!今天教程先到这,后面的东西慢慢更新,大神勿喷,后辈献丑了!