web-dev-qa-db-ja.com

単純なクラスをXMLにシリアル化/逆シリアル化する方法とその逆の方法

データベースへの往復を設定せずに、クラスの保存データをエミュレートしたい場合があります。たとえば、次のクラスがあるとします。

_public class ShoppingCart
{
    public List<CartItem> Items {get; set;}
    public int UserID { get; set; }
}

public class CartItem
{
    public int SkuID { get; set; }
    public int Quantity  { get; set; }
    public double ExtendedCost  { get; set; }
}
_

メモリ内にShoppingCartオブジェクトを構築し、それをXMLドキュメントとして「保存」したいとします。これはある種のXDocument.CreateFromPOCO(shoppingCart)メソッドを介して可能ですか?他の方向についてはどうですか:new ShoppingCart(xDoc)のようなXMLドキュメントからShoppingCartオブジェクトを作成する組み込みの方法はありますか?

24
Ben McCormack

XmlSerializer は、これを行う1つの方法です。 DataContractSerializer は別です。 XmlSerializerの例:

using System.Xml;
using System.Xml.Serialization;

//...

ShoppingCart shoppingCart = FetchShoppingCartFromSomewhere();
var serializer = new XmlSerializer(shoppingCart.GetType());
using (var writer = XmlWriter.Create("shoppingcart.xml"))
{
    serializer.Serialize(writer, shoppingCart);
}

そしてそれを逆シリアル化するには:

var serializer = new XmlSerializer(typeof(ShoppingCart));
using (var reader = XmlReader.Create("shoppingcart.xml"))
{
    var shoppingCart = (ShoppingCart)serializer.Deserialize(reader);
}

また、より良いカプセル化のために、CartItemクラスのフィールドではなくプロパティを使用することをお勧めします。

54
Darin Dimitrov

よくできました。以下は、プレーンPOCOを文字列にシリアル化する例です。

    private string poco2Xml(object obj)
    {
        XmlSerializer serializer = new XmlSerializer(obj.GetType());
        StringBuilder result = new StringBuilder();
        using (var writer = XmlWriter.Create(result))
        {
            serializer.Serialize(writer, obj);
        }
        return result.ToString();
    }
9
Jeson Martajaya

XmlSerializer または DataContractSerializer のいずれかを使用してシリアル化/逆シリアル化できます。

DataContractおよびDataMember属性を使用してクラスに注釈を付け、次のように記述して、XMLをファイルにシリアル化します。

ShoppingCart cart = ...
using(FileStream writer = new FileStream(fileName, FileMode.Create))
{
   DataContractSerializer ser = new DataContractSerializer(typeof(ShoppingCart));
   ser.WriteObject(writer, cart);
}
3
Mikael Svenson

[XmlElement(name)](またはXmlAttribute、XmlRootなど)でシリアル化するものをマークアップし、XmlSerializerを使用します。本当にカスタムのフォーマットが必要な場合は、IXmlSerializableを実装してください。

0
AllenG