您的位置:首页 > 编程语言 > Java开发

Int类型数据的序列化以及反序列化(与Java服务器通讯预热)

2017-07-10 12:06 330 查看
游戏前端,避免不了的跟服务器通讯,其实游戏的大部分逻辑都在服务端,并不在客户端,所以需要跟服务端通讯“协商”一些逻辑,既然通讯,就少不了的传输,传输之前又要序列化,这篇博客主要讲一下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行的注释,如果加上注释,输
4000
出结果正好相反,如下图所示:



在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);
}
}


这样的话就可以来用这个方法直接序列化或者反序列化了!



今天教程先到这,后面的东西慢慢更新,大神勿喷,后辈献丑了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐