对象序列化后部分属性无故消失的解决办法
2017-08-10 13:45
246 查看
对象序列化后部分属性无故消失
在项目中添加了一个WebService引用,组合完提交参数,提交到服务器,发现对象里少了几个属性值。为了搞清楚问题所在,用代码将提交的参数序列化成xml字符串,发现果然少了几个属性。为什么会这样了,属性明明就赋值了,怎么序列化后就没了呢?百思不得其解,郁闷了很久。笨人就用笨办法,于是将实体属性逐个减少声明对象再序列化,看看问题究竟出在哪里。黄天不负有心人,终于找到了问题所在,就是那个名字后面带Specified的bool类型的属性在作怪。不多说了,我们看下面的代码。实体1
public class Person { public string Name { get; set; } public DateTime Birthday { get; set; } }
上面这个实体,序列化是没有问题,一切正常,大家可以自己写代码试试。问题出在下面的代码上
实体2
public class Person { public string Name { get; set; } public bool NameSpecified { get; set; } public DateTime Birthday { get; set; } }
序列化后的xml字符串,Name属性不见了
<?xml version="1.0"?> <Person xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <NameSpecified xmlns="http://core.wsclient.ebiz.chac.com/">false</NameSpecified> <Birtyday xmlns="http://core.wsclient.ebiz.chac.com/">2017-08-10T13:30:53.7593836+08:00</Birtyday> </Person>
对比实体1,多了一个bool类型的NameSpecified属性,这个属性是干什么的呢?他就是控制Name属性是否应该被序列化,NameSpecified=true,Name属相将被序列化,反之则不会。微软为什么要做这个小动作呢?其初衷也不难猜出,大概就是为了减少数据冗余,节省网络带宽。好了,问题找到了,也就知道了相应的处理办法,检查有Specified的属相,如果需要序列化,就将其设置为true就行了。
相关文章推荐
- 调用WebAPI接口地址返回序列化的JSON对象中的属性都加了个k__BackingField关键字的解决办法
- 解决document.form1.submit()对象不支持此属性或方法的办法
- 如何Json序列化对象的部分属性
- Jackson序列化对象时无限递归错误Infinite recursion的解决办法
- ecshop transport.js IE报错(608行),对象不支持此属性或方法 的解决办法
- 关于PowerDesigner出现不允许有扩展属性,或对象不存在的解决办法
- jmail组件 对象不支持此属性或方法: 'JMail.ServerAddress' 的解决办法
- 错误“非静态的字段、方法或属性“System.Web.UI.Page.Response.get”要求对象引用”的解决办法
- flex模块切换时导致对象不正确序列化的解决办法
- TypeError: datetime.datetime(2016, 9, 25, 21, 12, 19, 135649) is not JSON serializable解决办法(json无法序列化对象的解决办法)
- 解决document.form1.submit()对象不支持此属性或方法的办法
- 关于使用jquery时,ie8下提示对象不支持的属性或方法的解决办法
- Ubuntu 12.04 iBus输入法托盘图标无故消失解决办法
- matlab坐标轴axes对象句柄消失的解决办法
- 解决document.form1.submit()对象不支持此属性或方法的办法
- CXF webService 对象属性值为null或空时生成xml缺少该字段节点 解决办法
- 关于PowerDesigner出现不允许有扩展属性,或对象不存在的解决办法
- JQuery-AJAX 不支持对象此方法或属性解决办法
- OrCAD DSN文件无故消失解决办法
- JQuery-AJAX 不支持对象此方法或属性解决办法