如题。
现在在一个实体中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序列化时是不起作用的。
微软是这样说的:XmlSerializer不序列化Null值,DataContractSerializer默认会序列化Null值。
所以,假如你真的想要null也弄出来,就要换DataContractSerializer,但是,DataContractSerializer也是很矫情的,他的属性是需要有序的。
至于 XmlSerializer不序列化Null值,我的理解的,他没办法序列化,<name/>这个和<name></name>在w3c规范中是一致的,所以,假如你用<name></name>表示name=null,那么你用什么表示name=""呢???,你可以试着把你对象中所有的null的字符串改为""。然后试一下。
我靠,才发现你没加分……
@ensleep: 这次忘记拿分出来了,但你还是回答了呀,哈哈。
所以说为什么编程是搬砖呢,把所有的属性设置默认值,属性多了就是纯粹的苦力活了。。。懒死我吧
@烽火情怀: 不是啊,如果你用的是C#6的话,可以public string name{get;set;}="";这样定义属性,自动默认值为""了。如果你不是C#6,你可以用反射的方式,在构造方法里面反射拿到自己所有属性,然后判断所有为string类型的,将其赋“”。
设个默认值""
后来者遇到此问题,可以用[XmlElement(IsNullable=true)]属性来让XmlSerializer强制生成一个空的节点.