13

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

[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 序列化 null 或空列表时,它会将 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>

事实上,上面的文件用序列化器反序列化就好了。

谢谢你的帮助!

4

2 回答 2

24

   [DataMember(EmitDefaultValue=false)]

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

于 2009-04-01T23:51:32.593 回答
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);
    }
于 2013-03-28T19:00:41.080 回答