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