2011-10-27 24 views
11

Tôi đã làm việc với XML trong cơ sở dữ liệu LINQ và thấy rằng rất khó để làm việc với bộ nối tiếp.XMLSerializer để XElement

Cơ sở dữ liệu LINQ yêu cầu trường lưu trữ XElement.

Tôi có một đối tượng phức tạp với nhiều lớp cấu trúc tùy chỉnh, vì vậy tôi muốn sử dụng XmlSerializer để tuần tự hóa đối tượng.

Tuy nhiên, bộ nối tiếp chỉ có thể tuần tự hóa thành tệp ("C: \ xxx \ xxx.xml") hoặc luồng bộ nhớ.

Tuy nhiên để chuyển đổi hoặc tuần tự hóa nó thành XElement để tôi có thể lưu trữ trong cơ sở dữ liệu bằng LINQ?

Và Cách đảo ngược? tức là Deserialize một XElement ...

+0

Hãy nhớ đánh dấu câu trả lời! – bnieland

Trả lời

13

Cố gắng sử dụng này

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

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

deserialize:

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); 
} 
+1

Cảm ơn bạn rất nhiều !!!!!! – user883434

+0

Nhưng làm thế nào để làm ngược lại? – user883434

+0

Xem câu trả lời cập nhật của tôi – Stecya

0

SQL có kiểu dữ liệu XML có thể điều này có thể giúp bạn nhìn vào msdn

+0

Làm thế nào sẽ giúp với serialization hoặc XElement? –

4

Trước hết, hãy xem Serialize Method để thấy rằng bộ nối tiếp có thể xử lý nhiều hơn chỉ các luồng hoặc tệp bộ nhớ.

Thứ hai, thử sử dụng XElement.CreateWriter và sau đó truyền kết quả XmlWriter cho bộ nối tiếp.

+0

XElement.CreateWriter dường như không có sẵn – user1234883

+0

Xem http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.createwriter.aspx. –

+0

Có, bạn đã đúng. Tôi phải nhìn vào lớp sai. Lấy làm tiếc – user1234883

6

Để làm gì John Saunders đã được mô tả rõ ràng hơn, deserialization là rất đơn giản:

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

Serialization là một Messier chút vì gọi CreateWriter() từ một XElement hoặc XDocument tạo ra phần tử con. (Ngoài ra, XmlWriter được tạo từ một XElement có ConformanceLevel.Fragment, làm cho XmlSerialize thất bại trừ khi bạn sử dụng workaround here.) Kết quả là, tôi sử dụng XDocument, vì điều này yêu cầu một phần tử duy nhất và đưa chúng ta đến XmlWriter vấn đề:

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; 
}