〇、前言:
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!!