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

〇、前言:

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

UnityEngine.JsonUtility.ToJson()

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

低版本的.Net系列框架里面,没有提供System.Text.Json,你可以在NuGet包管理器中下载System.Text.Json组件包
在这里插入图片描述

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

在这里插入图片描述

二、客户端和服务器用于系列化和反系列化的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>(); //试验步骤数据表
}
/// <summary>
/// 实验步骤
/// </summary>
[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端系列化的实现

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

四、WinForm端反系列的实现

        /// <summary>
        /// 反系列化:把字节数组byte[]恢复成指定类型T的数据
        /// byte[] -> Json string -> Object
        /// </summary>
        /// <typeparam name="T">反系列化恢复成什么类型的数据</typeparam>
        /// <param name="bytesAry">字节数组</param>
        /// <returns>指定类型的数据</returns>
        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!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值