Int类型数据的序列化以及反序列化(与Java服务器通讯预热)
2017-07-10 12:06
330 查看
游戏前端,避免不了的跟服务器通讯,其实游戏的大部分逻辑都在服务端,并不在客户端,所以需要跟服务端通讯“协商”一些逻辑,既然通讯,就少不了的传输,传输之前又要序列化,这篇博客主要讲一下Int类型数据的序列化以及反序列化。
这是我博客新开的一个类别,这个类别主要讲前端与服务器的通讯原理和过程,以及实现方法,我会慢慢更新,直至更新完毕,都在学习,有什么问题可以大家一块商讨,一起解决问题!
Unity前端,主要语言是C#,当然也有用lua的,方便热更新,今天说的是C#先把基础的C#给搞明白,有前端就要有后端,后端语言很多种,这里我说的是Java,其他语言大差不差,基本原理都一样,掌握了这个一个基本上与服务器通讯不是什么难题。
首先C#与Java之间的序列化是相反的,比如序列化一个int类型的数,这个数是90,前端C#写法是这样的:
输出结果为:90,0,0,0
这样的输出结果本身是没错的,但是在Java端的结果正好是相反的,Java的结果是0,0,0,90;
所以必须要处理一下该数据,这个东西前端或者后端处理都可以,不过后端处理起来比较麻烦,所以我在前端就处理了就是哪个第21行的注释,如果加上注释,输
4000
出结果正好相反,如下图所示:
在C#中,反转数据只需要一句话,但是在Java中比较麻烦,所以建议前端反转该数据,反转只需要将第21行的代码注释去掉即可
或这加上:
这样的话就可以来用这个方法直接序列化或者反序列化了!
这是我博客新开的一个类别,这个类别主要讲前端与服务器的通讯原理和过程,以及实现方法,我会慢慢更新,直至更新完毕,都在学习,有什么问题可以大家一块商讨,一起解决问题!
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); } }
这样的话就可以来用这个方法直接序列化或者反序列化了!
今天教程先到这,后面的东西慢慢更新,大神勿喷,后辈献丑了!
相关文章推荐
- 各类数据的序列化以及反序列化的方法(与Java服务器通讯)
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- 序列化对象到Xml文件以及反序列话Xml文件到对象(序列化数据到8个Java原型类型)
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- hadoop数据类型以及序列化和反序列化
- Java数据类型中String、Integer、int的相互转换以及日期的转换
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- Rhythmk 一步一步学 JAVA(3): java JSON 数据序列化 以及反序列化
- 往服务器连续写7个字节的数据作为命令,但是javabyte类型的范围为-128-127。这样要转换
- .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
- Java数据类型中String、Integer、int相互间的转换
- NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
- java.math.BigInteger类型的数据转成int
- java基本数据类型&&int与Integer区别
- java基础学习 视频学习 数据类型以及运算符
- C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short
- Java中的数据类型以及数据类型转换
- Java各种数据类型详细介绍及其int与Integer的区别
- JAVA基础学习总结---原码、补码、反码以及基本数据类型
- Java中的移位操作以及基本数据类型转换成字节数组【收集】