首页 新闻 会员 周边

XmlSerializer 序列化实体时,如何不忽略为空的string类型属性

0
[已解决问题] 解决于 2015-12-23 17:01

如题。

现在在一个实体中string类型的属性在值为null时,将不被序列化。

[XmlRoot(ElementName="person")]

public class Person

{

  [XmlElement(ElementName="age")]

  public int Age{get;set;}

  [XmlElement(ElementName="name")]

  public string Name{get;set;}

}

以上实体在Name为null的情况下将被序列化为

<?xml version="1.0" encoding="utf-16"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <age>18</age>
</person>

而我这儿希望的是能够被序列化为

<?xml version="1.0" encoding="utf-16"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <age>18</age>
  <name />
</person>

 

想到的一个办法是设置默认值为空字符串,但这样的话所有属性都得写一遍。而且DefaultValueAttribute特性在Xml序列化时是不起作用的。

烽火情怀的主页 烽火情怀 | 菜鸟二级 | 园豆:380
提问于:2015-12-23 14:28
< >
分享
最佳答案
0

微软是这样说的:XmlSerializer不序列化Null值,DataContractSerializer默认会序列化Null值。

所以,假如你真的想要null也弄出来,就要换DataContractSerializer,但是,DataContractSerializer也是很矫情的,他的属性是需要有序的。

 

至于 XmlSerializer不序列化Null值,我的理解的,他没办法序列化,<name/>这个和<name></name>在w3c规范中是一致的,所以,假如你用<name></name>表示name=null,那么你用什么表示name=""呢???,你可以试着把你对象中所有的null的字符串改为""。然后试一下。

奖励园豆:5
ensleep | 小虾三级 |园豆:1682 | 2015-12-23 14:36

我靠,才发现你没加分……

ensleep | 园豆:1682 (小虾三级) | 2015-12-23 14:39

@ensleep: 这次忘记拿分出来了,但你还是回答了呀,哈哈。

所以说为什么编程是搬砖呢,把所有的属性设置默认值,属性多了就是纯粹的苦力活了。。。懒死我吧

烽火情怀 | 园豆:380 (菜鸟二级) | 2015-12-23 14:55

@烽火情怀: 不是啊,如果你用的是C#6的话,可以public string name{get;set;}="";这样定义属性,自动默认值为""了。如果你不是C#6,你可以用反射的方式,在构造方法里面反射拿到自己所有属性,然后判断所有为string类型的,将其赋“”。

ensleep | 园豆:1682 (小虾三级) | 2015-12-23 22:52
其他回答(2)
0

设个默认值"" 

s_p | 园豆:138 (初学一级) | 2015-12-23 14:42
0

后来者遇到此问题,可以用[XmlElement(IsNullable=true)]属性来让XmlSerializer强制生成一个空的节点.

大杯美式不加糖不加奶 | 园豆:994 (小虾三级) | 2018-03-21 18:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册