XmlRoot
似乎不適用於集合中包含的類。下面是我所定義的類:集合中的Xml序列化
[XmlRoot("cars")]
public class CarCollection : Collection<Car>
{
}
[XmlRoot("car")]
public class Car
{
[XmlAttribute("make")]
public String Make { get; set; }
[XmlAttribute("model")]
public String Model { get; set; }
}
這裏是我使用的序列化這些對象的代碼:
CarCollection cars = new CarCollection();
cars.Add(new Car { Make = "Ford", Model = "Mustang" });
cars.Add(new Car { Make = "Honda", Model = "Accord" });
cars.Add(new Car { Make = "Toyota", Model = "Tundra" });
using (MemoryStream memoryStream = new MemoryStream())
{
XmlSerializer carSerializer = new XmlSerializer(typeof(CarCollection));
carSerializer.Serialize(memoryStream, cars);
memoryStream.Position = 0;
String xml = null;
using (StreamReader reader = new StreamReader(memoryStream))
{
xml = reader.ReadToEnd();
reader.Close();
}
memoryStream.Close();
}
序列化之後的XML看起來是這樣的:
<cars xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Car make="Ford" model="Mustang" />
<Car make="Honda" model="Accord" />
<Car make="Toyota" model="Tundra" />
</cars>
公告車內的「C」不是小寫字母。爲了做到這一點,我需要改變什麼?如果我直接序列化汽車,它會按我的預期出現。
更新: 我發現了另一個解決方法。我不知道我有多喜歡它,但它適用於我的情況。如果我創建了一個自定義類(請參見下文),並從中派生CarCollection,則序列化將按我的預期工作。
public class XmlSerializableCollection<T> : Collection<T>, IXmlSerializable
{
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
bool wasEmpty = reader.IsEmptyElement;
reader.Read();
if (wasEmpty)
{
return;
}
XmlSerializer serializer = new XmlSerializer(typeof(T));
while (reader.NodeType != XmlNodeType.EndElement)
{
T t = (T)serializer.Deserialize(reader);
this.Add(t);
}
if (reader.NodeType == XmlNodeType.EndElement)
{
reader.ReadEndElement();
}
}
public void WriteXml(XmlWriter writer)
{
XmlSerializer reqSerializer = new XmlSerializer(typeof(T));
foreach (T t in this.Items)
{
reqSerializer.Serialize(writer, t);
}
}
}
你知道爲什麼插入自定義XmlSerializableCollection類的變通辦法導致序列化過程中產生你想要的XML呢? –
jameswelle
2009-08-18 21:31:37
它可以工作,因爲我手動序列化子對象,然後尊重子對象上的XMLRoot屬性。 – 2009-08-19 14:04:33