我可以将DataContractSerializer配置为不在输出XML中创建可选(即Nullable<>和List<>)元素吗?

时间:2009-04-01 23:17:53

标签: c# .net datacontractserializer

我正在使用新的.NET 3.0 DataContractSerializer。我有Nullable< >和列表< >对象我要序列化。例如:

[DataContract(Namespace = "")]
class Test
{
    public static void Go()
    {
        Test test = new Test();

        var dcs = new DataContractSerializer(typeof(Test));
        dcs.WriteObject(new StreamWriter("test.xml").BaseStream, test);
    }

    [DataMember]
    public Nullable<int> NullableNumber = null;

    [DataMember]
    public int Number = 5;

    [DataMember]
    public List<int> Numbers = new List<int>();
}

当.NET序列化空列表或空列表时,它将nil(对于Nullable)和空(对于列表)元素放入XML中。以上示例生成:

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <NullableNumber i:nil="true"/>
  <Number>5</Number>
  <Numbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
</Test>

由于原因,我没有时间来描述我想要消除多余的NullableNumber和Numbers元素,如下所示:

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Number>5</Number>
</Test>

实际上,上面的文件反序列化了串行器就好了。

感谢您的帮助!

2 个答案:

答案 0 :(得分:24)

标记字段
   [DataMember(EmitDefaultValue=false)]

至少可以为null的值类型情况。 对于List情况,您可能需要在需要时推迟创建列表,否则如果成员在序列化之前为空,则为null。

答案 1 :(得分:1)

我真的需要相同的东西,但全局应用于生成的RIA类中的许多字段。我不确定这个XML是否可以被DataConstract接受用于反序列化。但它是可读的,符合我的目的......

    public override string ToString()
    {
        var doc = XDocument.Parse(this.ToXML());
        WalkElement(doc.Root);
        return doc.ToString( SaveOptions.None );
    }
    void WalkElement(XElement e)
    {
        var n = e.GetNamespaceOfPrefix("i");
        if (n != null)
        {
            var a = e.Attribute(n + "nil");
            if (a != null && a.Value.ToLower() == "true")
                e.Remove();
        }
        foreach (XElement child in e.Elements().ToList())
            WalkElement(child);
    }