XML 带有可选段的序列化
XML Serialization with optional segment
当我想在下面序列化到 XML 时遇到问题,因为段 E1WPU03 是可选的,但是当它有值时,我需要将它放在段 E1WPU02
下
我已经尝试了两天,但最终它先写入段 E1WPU02,然后写入段 E1WPU03,但不起作用
我该怎么做?
XmlSerializer
通常不会交错元素。但是,您可以使用 List<>
和指定类型的多个 [XmlElement(...)]
来欺骗它:
class Program
{
static void Main()
{
var root = new MyXmlRoot
{
Items = {
new Bar { },
new Blap { },
new Bar { },
}
};
var ser = new XmlSerializer(typeof(MyXmlRoot));
ser.Serialize(Console.Out, root);
}
}
public abstract class Foo { } // base type used for the list
public class Bar : Foo {
// more props here
}
public class Blap : Foo {
// more props here
}
public class MyXmlRoot
{
private readonly List<Foo> items = new List<Foo>();
[XmlElement("E1WPUO2", typeof(Bar))]
[XmlElement("E1WPUO3", typeof(Blap))]
public List<Foo> Items { get { return items; } }
}
其他元素如 E1WPU01
不需要进入 Items
如果不需要交错 - 它们可以直接进入 MyXmlRoot
(你可能已经有) .
当我想在下面序列化到 XML 时遇到问题,因为段 E1WPU03 是可选的,但是当它有值时,我需要将它放在段 E1WPU02
下我已经尝试了两天,但最终它先写入段 E1WPU02,然后写入段 E1WPU03,但不起作用
我该怎么做?
XmlSerializer
通常不会交错元素。但是,您可以使用 List<>
和指定类型的多个 [XmlElement(...)]
来欺骗它:
class Program
{
static void Main()
{
var root = new MyXmlRoot
{
Items = {
new Bar { },
new Blap { },
new Bar { },
}
};
var ser = new XmlSerializer(typeof(MyXmlRoot));
ser.Serialize(Console.Out, root);
}
}
public abstract class Foo { } // base type used for the list
public class Bar : Foo {
// more props here
}
public class Blap : Foo {
// more props here
}
public class MyXmlRoot
{
private readonly List<Foo> items = new List<Foo>();
[XmlElement("E1WPUO2", typeof(Bar))]
[XmlElement("E1WPUO3", typeof(Blap))]
public List<Foo> Items { get { return items; } }
}
其他元素如 E1WPU01
不需要进入 Items
如果不需要交错 - 它们可以直接进入 MyXmlRoot
(你可能已经有) .