System.Text.Json和JavaScriptSerializer互相序列化出错
作者:admin 来源: 2022/12/15 14:32:57

    有如下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[]


称      呼:
联系方式:
您的评论:
技术支持:l.w.dong@qq.com www.luweidong.cn
广州市   wx:lwdred
Copyright © 2014 三味书屋 All Rights Reserved
技术支持:l.w.dong@qq.com  sitemap xml  sitemap html

粤公网安备44010602011869号

粤ICP备13031080号-1