XMLSerializer для XElement
Я работал с XML в базе данных LINQ и обнаружил, что работать с сериализатором очень сложно.
Для базы данных LINQ требуется поле, в котором хранятся XElement
.
У меня есть сложный объект со многими настраиваемыми структурными классами, поэтому я хотел бы использовать XmlSerializer для сериализации объекта.
Однако сериализатор может только сериализоваться в файл ( "C:\xxx\xxx.xml" ) или поток памяти.
Однако, чтобы преобразовать или сериализовать его как XElement, чтобы я мог хранить в базе данных с помощью LINQ?
И как сделать обратное? то есть десериализацию XElement...
Ответы
Ответ 1
Попробуйте использовать этот
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);
}
Ответ 2
Чтобы сделать то, что Джон Сондерс описывал более подробно, десериализация очень проста:
public static object DeserializeFromXElement(XElement element, Type t)
{
using (XmlReader reader = element.CreateReader())
{
XmlSerializer serializer = new XmlSerializer(t);
return serializer.Deserialize(reader);
}
}
Сериализация немного беспорядочна, потому что вызов CreateWriter()
из XElement или XDocument создает дочерние элементы. (Кроме того, XmlWriter, созданный из XElement, имеет 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;
}
Ответ 3
Прежде всего, см. Serialize Method, чтобы увидеть, что сериализатор может обрабатывать гораздо больше, чем просто потоки или файлы памяти.
Во-вторых, попробуйте использовать XElement.CreateWriter, а затем передайте полученный XmlWriter в сериализатор.
Ответ 4
У SQL может быть тип данных XML, это может помочь вам взглянуть на msdn