有如下model类序列化后通过tcp socket进行传输:
public class model
{
private byte[] senddata ;
public byte[] SendData
{
get { return senddata; }
set { senddata = value; }
}
private string version="00000";
public string Version
{
get { return version; }
set { version = value; }
}
}
后端使用.net6,使用System.Text.Json进行序列化。其中winShare是另外一个实体对象。先把winShare使用JsonSerializer.Serialize序列化成字符串,再使用System.Text.Encoding.Default.GetBytes转为byte[]。最后再用JsonSerializer.Serialize序列化一次成为字符串。
Model model = new Model();
model.SendData = System.Text.Encoding.Default.GetBytes(JsonSerializer.Serialize(winShare));
string msg = JsonSerializer.Serialize(model);
对方客户端使用tcp socket接收后,使用JavaScriptSerializer进行反序列化。
data是通过tcp socket接收到的byte[]。
JavaScriptSerializer js = new JavaScriptSerializer();
Model model = js.Deserialize<Model>(data);
执行后,就是报错:无法将类型为“System.String”的对象转换为类型“System.Byte[]”
2022-12-15 12:46:16
Msg:
Message:无法将类型为“System.String”的对象转换为类型“System.Byte[]”
Source:System.Web.Extensions
StackTrace: 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
在 System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue, Object o, String memberName, JavaScriptSerializer serializer, Boolean throwOnError)
在 System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)
在 inout.winsharer.Form1.CallWinSharerTCPClient_DataArrival(String data, IPAddress Ip, Int32 Port)
TargetSite:Boolean ConvertObjectToTypeInternal(System.Object, System.Type, System.Web.Script.Serialization.JavaScriptSerializer, Boolean, System.Object ByRef)
原因是经过
JsonSerializer.Serialize序列化后,SendData变成了字符串,导致解析错误。
{"SendData":"eyJ4IjowLCJ5IjQzJEMTOTUifQ==","Version":"00000"}
正确的应该类似这种:
{"SendData":[97,98,99],"Version":"00000"}
解决方法是,把SendData由byte[]类型改为int[]类型。再通过以下2个函数转换。
/// <summary>
/// 字节数组转int数组
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public int[] byteToInt(byte[] data)
{
if (data != null && data.Length > 0)
{
int[] ints = new int[data.Length];
for (int i = 0; i < data.Length; i++)
{
ints[i] = data[i];
}
return ints;
}
else
{
return null;
}
}
/// <summary>
/// int数组转字节数组
/// </summary>
/// <param name="ints"></param>
/// <returns></returns>
public byte[] intToByte(int[] ints)
{
if (ints != null && ints.Length > 0)
{
byte[] data = new byte[ints.Length];
for (int i = 0; i < ints.Length; i++)
{
data[i] = (byte)ints[i];
}
return data;
}
else
{
return null;
}
}
序列化时使用函数byteToInt()把byte[]数据转为int[]。
反序列化时使用函数intToByte()把int[]数据转为byte[]