我想将对象序列化为包含其他自定义类的xml。根据我的理解(我一直在阅读MSDN和SO),XmlSerializer
没有考虑到这一点。
令我困惑的是这条线:
XML序列化仅将对象的公共字段和属性值序列化为XML流。 XML序列化不包括类型信息。例如,如果库名称空间中存在Book对象,则无法保证将其反序列化为相同类型的对象。
取自MSDN,here
例如,我想序列化Order
类型的对象,但它包含Products
的列表,每个对象都包含Category
类型的对象:
class Order
{
List<Product> products;
}
class Product
{
Category type;
}
class Category
{
string name;
string description;
}
我希望我的Order
对象像这样序列化:
<Order>
<Product>
<Category Name="">
<Description></Description>
</Category>
</Product>
<Product>
<Category Name="">
<Description></Description>
</Category>
</Product>
<Order>
XmlSerializer
是否已经这样做了?如果没有,是否还有另一个类,我必须自己定义序列化过程?
答案 0 :(得分:1)
订单可以被视为产品列表,产品可以被视为类别列表(因为它可以属于多个类别)。
您可以尝试使用
//...
using System.Xml;
using System.Xml.Serialization;
//...
[XmlRoot("Order")]
public class Order
{
[XmlArrayItem(ElementName = "Product", Type = typeof(Product))]
public List<Product> Products;
}
public class Product
{
[XmlArrayItem(ElementName = "Category", Type = typeof(Category))]
public List<Category> Categories;
}
public class Category
{
[XmlAttribute("Name")]
public string name;
[XmlElement("Description")]
public string description;
}
唯一的权衡是,<Products>
和<Categories>
(复数)标签将是可见的,因为变量以这种方式命名,但从后来解析XML的角度来看那不是问题。
如果您不希望在XML中显示任何其他字段,则可以在它们之前加[XmlIgnore()]
。