2

我想将一个对象序列化为包含其他自定义类的 xml。据我了解(我一直在阅读 MSDN 和 SO),XmlSerializer并没有考虑到这一点。

这是让我感到困惑的一行:

XML 序列化仅将对象的公共字段和属性值序列化为 XML 流。XML 序列化不包括类型信息。例如,如果您有一个 Book 对象存在于 Library 命名空间中,则无法保证它将被反序列化为相同类型的对象。

取自 MSDN,这里

例如,我想序列化一个类型的对象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已经这样做了吗?如果没有,是否有另一个类可以或我必须自己定义序列化过程?

4

1 回答 1

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>and <Categories>(复数)标签是可见的,因为变量是这样命名的,但是从之后解析 XML 的角度来看,这不是问题。如果您不想要的任何其他字段出现在您的 XML 中,您可以将[XmlIgnore()]它们放在前面。

于 2012-10-04T07:01:05.190 回答