use*_*434 14 .net c# xml linq serializer
我一直在使用数据库LINQ中的XML,并发现使用序列化器非常困难.
数据库LINQ需要一个存储的字段XElement
.
我有一个复杂的对象有很多自定义的结构类,所以我想使用XmlSerializer来序列化对象.
但是,序列化程序只能序列化为文件("C:\ xxx\xxx.xml")或内存流.
但是要将它转换或序列化为XElement,以便我可以使用LINQ存储在数据库中?
以及如何做到相反?即反序列化XElement ...
Ste*_*cya 14
试着用这个
using (var stream = new MemoryStream())
{
serializer.Serialize(stream, value);
stream.Position = 0;
using (XmlReader reader = XmlReader.Create(stream))
{
XElement element = XElement.Load(reader);
}
}
Run Code Online (Sandbox Code Playgroud)
反序列化:
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);
}
Run Code Online (Sandbox Code Playgroud)
为了使John Saunders所描述的更加明确,反序列化非常简单:
public static object DeserializeFromXElement(XElement element, Type t)
{
using (XmlReader reader = element.CreateReader())
{
XmlSerializer serializer = new XmlSerializer(t);
return serializer.Deserialize(reader);
}
}
Run Code Online (Sandbox Code Playgroud)
序列化有点混乱,因为CreateWriter()
从XElement或XDocument 调用会创建子元素.(此外,从XElement创建的XmlWriter具有ConformanceLevel.Fragment,除非您使用此处的解决方法,否则会导致XmlSerialize失败.)因此,我使用XDocument,因为这需要单个元素,并让我们围绕XmlWriter问题:
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;
}
Run Code Online (Sandbox Code Playgroud)