2

オブジェクトを他のカスタムクラスを含むxmlとしてシリアル化したい。私が理解していることから(私はMSDNとSOを主に読んでいます)、XmlSerializerこれは考慮されていません。

これは私を混乱させている行です:

XMLシリアル化は、オブジェクトのパブリックフィールドとプロパティ値のみをXMLストリームにシリアル化します。XMLシリアル化には、タイプ情報は含まれません。たとえば、Library名前空間にBookオブジェクトが存在する場合、同じタイプのオブジェクトに逆シリアル化される保証はありません。

ここで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>および<Categories>(複数)タグが表示されることですが、後でXMLを解析するという観点からは、これは問題ではありません。XMLに不要な他のフィールドが表示されている場合は、[XmlIgnore()]それらの前に置くことができます。

于 2012-10-04T07:01:05.190 に答える