2011-10-27 17 views
11

私はデータベースLINQでXMLを使って作業していて、シリアライザを扱うのが非常に難しいことがわかりました。XMLSerializerからXElement

データベースLINQには、XElementを格納するフィールドが必要です。

多くのカスタマイズされた構造体クラスを持つ複雑なオブジェクトがあるので、XmlSerializerを使用してオブジェクトをシリアル化します。

ただし、シリアライザはファイル( "C:\ xxx \ xxx.xml")またはメモリストリームにのみシリアル化できます。

しかし、LINQを使用してデータベースに格納できるように、それをXElementに変換またはシリアル化するには?

そして逆の方法は?

XmlSerializer xs = new XmlSerializer(typeof(XElement)); 
using (MemoryStream ms = new MemoryStream()) 
{ 
    xs.Serialize(ms, xml); 
    ms.Position = 0; 

    xs = new XmlSerializer(typeof(YourType)); 
    object obj = xs.Deserialize(ms); 
} 
+0

覚えておいてください! – bnieland

答えて

13

を見て助けることができるかもしれありまず、Serialize Methodを参照して、シリアライザがメモリストリームやファイル以外の多くを処理できることを確認してください。

第2に、XElement.CreateWriterを使用して、結果のXmlWriterをシリアライザに渡してみてください。

+1

ありがとうございました!!!!!! – user883434

+0

しかし、その逆を行うには? – user883434

+0

私の更新された回答を参照してください – Stecya

0

SQLは、XMLデータ型は、これがこの

using (var stream = new MemoryStream()) 
{ 
    serializer.Serialize(stream, value); 
    stream.Position = 0; 

    using (XmlReader reader = XmlReader.Create(stream)) 
    { 
     XElement element = XElement.Load(reader); 
    } 
} 

にデシリアライズを使用してみてくださいあなたはmsdn

+0

シリアライゼーションやXElementでどのように役立ちますか? –

4

:すなわちXElementオブジェクトをデシリアライズ...

+0

XElement.CreateWriterが利用可能でないようです。 – user1234883

+0

http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.createerer.aspxを参照してください。 –

+0

はい、そうです。私は間違ったクラスを見ているに違いない。ごめんなさい – user1234883

6

ジョン・サンダースは、より明確な記述されたものにするために、直列化復元は非常に簡単です:XElementオブジェクトまたはXDocumentからCreateWriter()を呼び出すと、子要素を作成するため

public static object DeserializeFromXElement(XElement element, Type t) 
{ 
    using (XmlReader reader = element.CreateReader()) 
    { 
     XmlSerializer serializer = new XmlSerializer(t); 
     return serializer.Deserialize(reader); 
    } 
} 

シリアライゼーションは少し乱雑です。 (また、XElementから作成されたXmlWriterにはConformanceLevel.Fragmentがあり、回避策hereを使用しない限り失敗します)。問題:

public static XElement SerializeToXElement(object o) 
{ 
    var doc = new XDocument(); 
    using (XmlWriter writer = doc.CreateWriter()) 
    { 
     XmlSerializer serializer = new XmlSerializer(o.GetType()); 
     serializer.Serialize(writer, o); 
    } 

    return doc.Root; 
} 
関連する問題