我可以配置的DataContractSerializer不创建可选的(即,可空<>和列表<>)在输出XML元素?

StackOverflow https://stackoverflow.com/questions/707711

  •  22-08-2019
  •  | 
  •  

我使用新.NET 3.0的DataContractSerializer。我有我要两个序列可空<< EM >>和<<列出/ EM >>对象。例如:

[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串行化一个空值或空列表,它把在零(对于可为空)和空(列表)元素到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和数字元件,像这样:

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

实际上,上述文件与解串串行就好了。

感谢您的帮助!

有帮助吗?

解决方案

标记与场

   [DataMember(EmitDefaultValue=false)]

这将用于在至少所述空值类型的情况下工作。 对于列表情况下,如果序列化之前是空的,你可能需要推迟列表的创建直到需要它,否则空的成员。

其他提示

我真的需要同样的事情,但全局应用到很多领域中产生的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);
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top