Serializable引起System.StackOverFlowException

独立开发者6年前 (2016-12-23)编程技术1452

场景:web client + webapi,涉及到对象序列化

传输的对象使用Serializable属性时的调试效果,出现堆栈溢出,iisexpress也挂掉了。

出现这个问题,一般也难找出问题所在,但是看response的json字符串有很多k_backingField的属性,这种属性的生成应该是序列化时自动生成的,应该是自动属性的原因,有时间有同学可以验证下,也可以使用Reflector反汇编看看自动属性生成的字段前缀,或者用ILSpy,用ILSpy看了下并没有生成字段前缀,不知道Reflector是什么效果。

将Serializable属性变成DataContract后,程序不再中断,输出正常,只是没有带出字段,因为没有标明DataMember


加了DataMember后response正常了。

最终的代码如图,重点地方已用红框标出。

因此,这里要搞清楚Serializable和DataContract的用法。

[Serializable] 序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本 说的简单点就是  对象是暂时保存在内存中的,不能用U盘考走了,有时为了使用介质转移对象,并且把对象的状态保持下来,就需要把对象保存下来,这个过程就叫做序列化

数据契约[DataContract] 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送


相关文章

Linux入门看这篇就够了

Linux入门看这篇就够了

对于嵌入式而言,大部分人的进阶路线:单片机 -> RTOS -> Linux。下面,针对有单片机、RTOS基础的同学,分享一份入门 Linux 的基础内容。下方超长干货预警,建议先收藏,再...

IdentityServer4在.net6中使用的变化

IdentityServer4在.net6中不再使用DiscoveryClient之前使用的DiscoveryClient连接Identity Server,这次使用时发现找不到了,查了文档发现已更新...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。