XmlArrayItemAttributeクラスでIsNullable =true を使用します。例として。
[XmlRoot("Root")]
public class Root
{
[XmlArrayItem("Element", IsNullable = true)]
public string[] Elements { get; set; }
}
Visual Studion 2012 および .Net 4.5 のサンプル コード:
using System.Xml.Serialization;
...
// Test object
Root root;
root = new Root();
root.Elements = new string[] { null, "abc" };
using(MemoryStream stream = new MemoryStream())
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Root));
xmlSerializer.Serialize(stream, root);
Console.WriteLine(new string(Encoding.UTF8.GetChars(stream.GetBuffer())));
}
出力は次のとおりです (わかりやすくするために改行が追加されています)。
<?xml version="1.0"?>
<Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Element>
<string xsi:nil="true" />
<string>abc</string>
</Element>
</Root>
複合型の場合 (Visual Studio 2012 の .Net 4.5 でも):
public class MyProperty
{
public string Foo { get; set; }
}
[XmlRoot("Root")]
public class Root
{
[XmlArrayItem("Element", IsNullable = true)]
public MyProperty[] Elements { get; set; }
}
,,,
Root root;
root = new Root();
root.Elements = new MyProperty[] { null, new MyProperty{ Foo = "bar" } };
// Other code is as above
上記と同じコードを使用すると、以下が生成されます。
<?xml version="1.0"?>
<Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Elements>
<Element xsi:nil="true" />
<Element>
<Foo>bar</Foo>
</Element>
</Elements>
</Root>
また、型を書き出すには、型が参照型 (構造体などではない) でなければならないことにも注意してくださいxsi:nil=true
。