Serializable引起System.StackOverFlowException
场景:web client + webapi,涉及到对象序列化
传输的对象使用Serializable属性时的调试效果,出现堆栈溢出,iisexpress也挂掉了。
出现这个问题,一般也难找出问题所在,但是看response的json字符串有很多k_backingField的属性,这种属性的生成应该是序列化时自动生成的,应该是自动属性的原因,有时间有同学可以验证下,也可以使用Reflector反汇编看看自动属性生成的字段前缀,或者用ILSpy,用ILSpy看了下并没有生成字段前缀,不知道Reflector是什么效果。
将Serializable属性变成DataContract后,程序不再中断,输出正常,只是没有带出字段,因为没有标明DataMember
加了DataMember后response正常了。
最终的代码如图,重点地方已用红框标出。
因此,这里要搞清楚Serializable和DataContract的用法。
[Serializable] 序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本 说的简单点就是 对象是暂时保存在内存中的,不能用U盘考走了,有时为了使用介质转移对象,并且把对象的状态保持下来,就需要把对象保存下来,这个过程就叫做序列化
数据契约[DataContract] 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送