序列化包含自定义类的类

时间:2012-09-30 21:35:56

标签: c# xml xml-serialization

我想将对象序列化为包含其他自定义类的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是否已经这样做了?如果没有,是否还有另一个类,我必须自己定义序列化过程?

1 个答案:

答案 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()]