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

游戏前端,避免不了的跟服务器通讯,其实游戏的大部分逻辑都在服务端,并不在客户端,所以需要跟服务端通讯“协商”一些逻辑,既然通讯,就少不了的传输,传输之前又要序列化,这篇博客主要讲一下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);
    }
}

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

 
 
今天教程先到这,后面的东西慢慢更新,大神勿喷,后辈献丑了!

猜你喜欢

转载自blog.csdn.net/Superficialtise/article/details/74911208