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

這樣的話就可以來用這個方法直接序列化或者反序列化了!


今天教程先到這,後面的東西慢慢更新,大神勿噴,後輩獻醜了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章