Unity中的【格式化数据】进行【系列化】后传到服务器再【反系列化】操作(二)

〇、前言:

Unity里面把Object 系列化成Json的方法为:

UnityEngine.JsonUtility.ToJson()

服务端WinForm中把Json反系列化成Object的方法为:
System.Text.Json.JsonSerializer.Deserialize()

低版本的.Net系列框架里面,没有提供System.Text.Json,你可以在NuGet包管理器中下载System.Text.Json组件包
Unity中的【格式化数据】进行【系列化】后传到服务器再【反系列化】操作(二)_第1张图片

一、【系列化】、【网络传输】、【反系列化】整个过程

Unity中的【格式化数据】进行【系列化】后传到服务器再【反系列化】操作(二)_第2张图片

二、客户端和服务器用于系列化和反系列化的Class定义

  • 客户端的定义
public class SendData
{
    public string resproCode;  //资源标识
    public int status;         //实验结果
    public int score;          //实验成绩
    public long startTime;     //实验开始时间
    public long endTime;       //实验结束时间
    public List<StepData> steps = new List<StepData>(); //试验步骤数据表
}
/// 
/// 实验步骤
/// 
[Serializable]
public class StepData
{
 
    public int seq;             //实验步骤序号
    public string title;        //实验步骤名称
    public long startTime;      //实验步骤开始时间
    public long endTime;        //实验步骤结束时间
    public int expectTime;      //实验步骤合理用时
    public int maxScore;        //实验步骤满分
    public int score;           //实验步骤得分
    public int repeatCount;     //实验步骤操作次数 
    public string evaluation;   //步骤评价
    public string scoringModel; //赋分模型
    public string remarks;      //备注
}
  • 服务端的定义
    【注意需要弄成public 的属性,弄成public的字段不能反系列化】

    public class SendData
    {
        public string resproCode { get; set; }  //资源标识
        public int status { get; set; }         //实验结果          
        public int score { get; set; }          //实验成绩           
        public long startTime { get; set; }     //实验开始时间          
        public long endTime { get; set; }       //实验结束时间           
        public List<StepData> steps { get; set; } = new List<StepData>(); //试验步骤数据表
    }

    public class StepData
    {
        public int seq { get; set; }             //实验步骤序号 
        public string title { get; set; }        //实验步骤名称
        public long startTime { get; set; }      //实验步骤开始时间
        public long endTime { get; set; }        //实验步骤结束时间
        public int expectTime { get; set; }      //实验步骤合理用时
        public int maxScore { get; set; }        //实验步骤满分
        public int score { get; set; }           //实验步骤得分
        public int repeatCount { get; set; }     //实验步骤操作次数
        public string evaluation { get; set; }   //步骤评价
        public string scoringModel { get; set; } //赋分模型
        public string remarks { get; set; }      //备注
    }

三、Unity端系列化的实现

    /// 
    /// 系列化:把某个类型的数据对象dataToSerialize转换成Json,然后再转换成字节数组byte[]
    /// 
    /// 数据对象的数据类型
    /// 数据对象
    /// 字节数组
    public static byte[] SerializeViaJson<T>(T dataToSerialize)
    {
        var jsonStr = JsonUtility.ToJson(dataToSerialize);
        Debug.Log($"json内容为:\n {jsonStr}");
        return Encoding.UTF8.GetBytes(jsonStr);
    }

四、WinForm端反系列的实现

        /// 
        /// 反系列化:把字节数组byte[]恢复成指定类型T的数据
        /// byte[] -> Json string -> Object
        /// 
        /// 反系列化恢复成什么类型的数据
        /// 字节数组
        /// 指定类型的数据
        public static T DeSerializeViaJson<T>(byte[] bytesAry)
        {
            var jsonStr = Encoding.UTF8.GetString(bytesAry);
            Console.WriteLine($"json内容为:\n {jsonStr}");
            var obj = JsonSerializer.Deserialize<T>(jsonStr);         
            return obj;
        }

五、测试

客户端:Win10,Unity Editor
服务端:Win10,WinForm
通信方式:Socket

using System.Net;
using System.Net.Sockets;

测试ok!!

你可能感兴趣的:(unity,游戏引擎)