1. 问题描述
(1)Send时将List<PlatenInfo>数据通过Json序列化成string类型,并通过Socket发送。
string recipeInfo = JsonSerializer.Serialize<List<PlatenInfo>>(wafer.RecipeInfo);
var recipeData = Encoding.UTF8.GetBytes(recipeInfo);
_acceptSocket.Send(recipeData);
(2)接收端Receive数据后,通过Json反序列化成List<PlatenInfo>数据。
try
{
byte[] buffer = new byte[1024]; //Receive数据时要先指定读取字节长度
_tcpClient.Receive(buffer);
string msg = Encoding.UTF8.GetString(buffer);
List<PlatenInfo>? list = JsonSerializer.Deserialize<List<PlatenInfo>>(msg);
}
catch (Exception ex)
{
Log(ex.Message);
}
在反序列化的时候发生异常:
2. 问题分析
Socket将接收到的数据放到设定了1024字节大小的buffer中,buffer前有部分是有效的信息,后半段是空白\0符号。只有前半部分才可以反序列化成想要的结果,而整个操作的话就异常了。
3. 问题解决:
可以去除尾部0x00空白区域。
如果像上述字符编码的,则可以在接收到data并转换为string后,再直接加上:
msg = msg.TrimEnd('\0'); //将最后的0x00空白区域去掉
便可以反序列化成功。