首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用JavaScriptSerializer序列化C#对象会在UTF8字符串中产生无效字节

问题:使用JavaScriptSerializer序列化C#对象会在UTF8字符串中产生无效字节。

回答:

JavaScriptSerializer是.NET Framework中的一个类,用于将C#对象序列化为JSON格式的字符串。在使用JavaScriptSerializer序列化C#对象时,如果对象中包含非UTF8编码的字符,就会在UTF8字符串中产生无效字节。

UTF8是一种可变长度的Unicode编码,它可以表示世界上几乎所有的字符。然而,某些字符可能无法直接由UTF8编码表示,这就会导致在序列化过程中产生无效字节。

为了解决这个问题,可以采取以下几种方法:

  1. 使用DataContractJsonSerializer:DataContractJsonSerializer是另一个.NET Framework中的类,用于将C#对象序列化为JSON格式的字符串。与JavaScriptSerializer不同,DataContractJsonSerializer对非UTF8编码的字符有更好的处理能力,可以避免产生无效字节。
  2. 使用Json.NET库:Json.NET是一个流行的第三方JSON序列化库,它提供了更强大和灵活的功能。Json.NET对非UTF8编码的字符有良好的支持,可以避免产生无效字节。可以通过NuGet包管理器将Json.NET添加到项目中,并使用其提供的JsonSerializer类进行序列化操作。
  3. 处理非UTF8编码字符:如果需要使用JavaScriptSerializer进行序列化,并且对象中包含非UTF8编码的字符,可以在序列化之前对这些字符进行处理。可以使用System.Text.Encoding类将这些字符转换为UTF8编码,或者使用其他编码方式进行转换。

总结:

使用JavaScriptSerializer序列化C#对象可能会在UTF8字符串中产生无效字节。为了避免这个问题,可以选择使用DataContractJsonSerializer或Json.NET库进行序列化操作,或者在序列化之前对非UTF8编码的字符进行处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

详解C# 序列化和反序列化

今天我利用这篇文章给大家讲解一下 C# 序列化与反序列化。这两个概念我们在开发中经常用到,但是我们绝大部分只用到了其中的一部分,剩下的部分很多开发人员并不清楚,伸着可以说是不知道。...一、c# 序列化/反序列化c# 我们经常会对 JSON 和 XML 进行序列化和反序列化 ,但是还有存在一种序列化/反序列化,那就是将对象序列化为二进制文件,将会二进制文件反序列化对象。...JavaScriptSerializer 我们利用前面定义的类,来看一下 JavaScriptSerializer使用方法,我们将前面定义的类的 DataContract 和 DataMember...NET 中提供 XmlSerializer 类将对象序列化为 XML 和将 XML 反序列化对象使用方法是首先实例化,然后调用序列化/反序列化方法。...二进制 序列化为二进制,在实际开发真的很少用到,但是我觉得还是有必要讲一讲,它的使用方法和 XmlSerializer 序列化/反序列化类似,首先实例化,然后调用序列化/反序列化方法。

4.2K20

.NET基础拾遗(3)字符串、集合和流

但在实际开发中经常碰到的情况是,一个String对象的最终生成需要经过一个组装的过程,而在这个组装过程必将会产生很多临时的String对象,而这些String对象会在堆上分配,需要GC来回收,这些动作都会对程序性能产生巨大的影响...在C#,可以使用System.Text.Encoding来管理常用的编码。   ...下面的代码展示了如何在字节数组和字符串之间进行转换(分别使用UTF8、GB2312以及Unicode三种编码方式): class Program { static void...1.5 简述字符串驻留池机制   字符串具有不可变性,程序对于同一个字符串的大量修改或者多个引用赋值同一字符串在理论上会产生大量的临时字符串对象,这会极大地降低系统的性能。...通过上面的流类型可以方便地操作各种字节流,但是如何把现有的实例对象转换为方便传输的字节流,就需要使用序列化技术。对象实例的序列化,是指将实例对象转换为可方便存储、传输和交互的流。

1.9K10

了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult

CLR对象到JSON格式字符串序列化过程通过具有如下定义的序列化JavaScriptSerializer来完成。...JavaScriptSerializer的Serialize和Deserialize方法实现了CLR对象序列化和对JSON字符串的反序列化。...RecursionLimit用于设置被序列化对象和反序列化生成对象结构的允许的层级数,默认值为100。...定义在JsonResult的ExecuteResult方法通过JavaScriptSerializer对数据对象序列化,并将序列化生成的JSON字符串作为内容对请求进行响应,具体的逻辑基本上可以通过下面的代码片断来体现...将数据对象序列化成JSON字符串并写入当前HttpResponse 21: if (null == this.Data)return; 22: JavaScriptSerializer

1.7K50

使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例

与MessagePack for C#[2] (一个快速的二进制序列化程序)相比标准对象序列化库性能快几倍,当数据最优时,性能甚至快 50~100 倍。...浮点数(4 字节)是 MessagePack 5 个字节的固定长度。额外的 1 个字节以标识符为前缀,指示值的类型(整数、浮点数、字符串...)。...字符串优化 MemoryPack 有两个字符串规范:UTF8 或 UTF16。由于 C# 字符串是 UTF16,因此将其序列化为 UTF16 可以节省编码/解码为 UTF8 的成本。...许多序列化程序使用 Encoding.UTF8.GetByteCount,但也应该避免它,因为 UTF8 是一种可变长度编码,GetByteCount 完全遍历字符串以计算确切的编码后大小。...(utf8data, str); 典型序列化程序的字符串格式为 UTF8,它不能解码为 UTF16,因此即使您想要长度为 UTF16 以便作为 C# 字符串进行高效解码,它也不在数据

1.5K20

Jquery ajax调用后台aspx后台文件方法(不是ashx)

在asp.net webForm开发,用Jquery ajax调用aspx页面的方法常用的有两种:下面我来简单介绍一下。  ...WebMethod方法的用法    1.修饰符主要用public static修饰    2.方法前面加上[WebMethod]属性表明这是WebMethod方法    3.前台html页面(Client端)访问时要使用...$("#CBFBM").val(msg); } });   ashx.cs代码: <%@ WebHandler Language="<em>C#</em>...JSON<em>序列化</em>,<em>序列化</em>代码如下: <em>JavaScriptSerializer</em> jsonUtil = new <em>JavaScriptSerializer</em>(); string json = jsonUtil.Serialize...(需要返回的<em>对象</em>);    (4)序列完后前台html页面接收需要用each遍历时,因为in对<em>字符串</em>不管用,所以要对传过来的<em>字符串</em>进行Json化,代码如下 $.get(url,function(

6.8K50

了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult

CLR对象到JSON格式字符串序列化过程通过具有如下定义的序列化JavaScriptSerializer来完成。...JavaScriptSerializer的Serialize和Deserialize方法实现了CLR对象序列化和对JSON字符串的反序列化。...RecursionLimit用于设置被序列化对象和反序列化生成对象结构的允许的层级数,默认值为100。...定义在JsonResult的ExecuteResult方法通过JavaScriptSerializer对数据对象序列化,并将序列化生成的JSON字符串作为内容对请求进行响应,具体的逻辑基本上可以通过下面的代码片断来体现...将数据对象序列化成JSON字符串并写入当前HttpResponse 21: if (null == this.Data)return; 22: JavaScriptSerializer

1.7K80

详解电子表格的json数据:序列化与反序列化

把JavaScript对象变成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样才能够通过网络传递给其他计算机。...如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。...JSON的数据形式与转化方式 在JSON,数据有以下几种形式: 对象:一个没有顺序的"键/值",格式如 数组:用以设置数值顺序,格式如 字符串:任意数量的Unicode字符,格式如 进行数据序列化和反序列化的方式有以下三种...在使用自定义序列化的过程,查看相关代码,处理序列化的核心是typeName 字段在调用toJSON函数的过程,比如,可以将此类姓名和window对象联系。...使用过程需要注意以下问题: 给 typeName 字段设置完整的类型名字符串(如果有命名空间也应包含命名空间)。

1.6K50

快速序列化组件MessagePack介绍

对象序列化 MessagePack for C#可以序列化public Class或Struct,序列化目标必须标记[MessagePackObject]和[Key], Key类型可以选择int或字符串...出于这个原因,我建议您基本上使用MessagePack for C#特性。 序列化不可变对象序列化构造器) MessagePack for C#支持反序列化不可变对象。...MessagePack for C#始终是快速的,为所有类型(原始,小结构,大对象,任何集合)进行了优化。 反序列化每个方法的性能 性能取决于选项。...因此,它将从字节数组(或流)而不是字符串读取。 MessagePack for C#IntKey是最快的。 StringKey比IntKey慢,因为StringKey需要从字符串进行匹配。...首先,它不会将UTF8字节数组解码为与成员名称匹配的字符串,它会按原样查找字节数组(避免解码成本和额外分配)。

3.8K31

4种解决json日期格式问题的办法

开发中有时候需要从服务器端返回json格式的数据,在后台代码如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示: //设置服务器响应的结果为纯文本格式...JavaScriptSerializer jss=new JavaScriptSerializer(); //序列化学生集合对象得到json字符...JavaScriptSerializer jss = new JavaScriptSerializer(); //序列化学生集合对象得到json字符...运行结果: 这时候的日期格式就已经变成友好格式了,不过在javascript这只是一个字符串。...方法二: 在javascript中将"Birthday":"\/Date(1391141532000)\/"字符串转换成javascript的日期对象,可以将Birthday这个Key所对应的Value

1.9K10

信息论III:寻找序列化的极限

msp之所以基于Huffman指的是,msp每一种数据类型就是一个编码对象。 变长基本类型包括变长实数、变长字符串、变长字节串。...但是msp因为通过前缀来限定长度,无需分隔符/终止符,前后2个msp对象可以无缝衔接。 ? 举个例子。 图中这个demo里面,29字节的json对象经过msp压缩之后变成20字节。...UTF-8极限压缩 为了达到序列化的压缩极限,我们给每种数据类型挨个分析,先从最简单的字符串开始。 ?...uft8是耳熟能详的字符编码了,而且是变长编码,utf8的Huffman表如上图,目前utf8字符的长度从1~4字节不等,每种字符又有不同的前缀,但存在2种特殊的前缀,分别是: 后续字节前缀(10)...这两个前缀之所以特殊是因为它们在utf8的Huffman树上存在但不能表示具体的编码对象,如下图: ? 图中标红的2个前缀就是违反原则一的2个前缀,如果把这两片叶子从树上摘掉会怎么样呢?

55710

剖析.NET开源库-AlterNats是如何做到高性能发布订阅的?

在请求发送,有很多小的字符串和byte[]对象,这些小对象会比较频繁产生从而影响GC标记时间,在AlterNats,比较多的使用了stackalloc byte[10]将这些小的对象分配在栈上,当方法结束时...使用传统的ThreadPool.QueueUserWorkItem(callback)会有额外的内存分配,因为它会在内部创建一个ThreadPoolWorkItem并将其塞入线程池队列。...可以使用ConcurrentQueue或者类似的轻松实现对象池,上面的类,通过实现IObjectPoolNode接口,使它自己成为栈的节点,避免分配数组。...堆栈也可以提供一个无效的实现,为这种缓存的使用进行优化。 零拷贝架构 需要发布、订阅的数据通常是序列化C#类型,比如Json、MessagePack等。...使用最新的Socket ValueTask API 将所有的功能放到单个对象,降低SDK的内存分配 池化SDK使用类,栈上分配数据,做到堆上零分配 使用二进制方式解析NATS协议 对读取和写入自动进行批处理

54420

金九银十准备季:Java IO流面试题(含答案)「建议收藏」

补充:关于Java的IO需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。另外Java的流不同于C#的是它只有一个维度一个方向。...ObjectInputStream 用于恢复那些以前序列化对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统的实参和形参。...StringBufferInputStream此类允许应用程序创建输入流,在该流读取的字节字符串内容提供。...应用程序还可以使用ByteArrayInputStream 从 byte 数组读取字节。 只有字符串每个字符的低八位可以由此类使用。...2)如果对象的某个属性是对象类型,必须也实现Serializable接口才可以,序列化对静态变量无效 3)如果不希望某个属性参与序列化,不是将其static,而是transient串行化保存的只是变量的值

67040

在Cookie存储对象

,但因为Cookie只能存储字符串,所以想到了先把用户实体序列化成Json串,存储在Cookie,用到的时候再拿出来反序列化。...(我的开发环境为VS2012,.net framework版本为4.0,) C#Json与对象之间的互相转换 ---- 下载并引用Newtonsoft.Json.dll 定义一个简单的用户实体: public...(obj); } 将Json串反序列化对象: /// /// 从Json字符串序列化对象 /// /// <param name="jsonString...; 说明:实体的属性值有中文时,<em>序列化</em>的<em>字符串</em>存储到Cookie<em>中</em>时会<em>产生</em>乱码,为了防止<em>产生</em>乱码,我们在存入Cookie之前先用UrlEncode()和UrlDecode()对Json串进行编码与解码。...而且,一般的浏览器支持的Cookie存储的容量为4k(差也就差一两个<em>字节</em>),足够存储一个经过<em>序列化</em>的<em>对象</em>了。

3.7K40
领券