XMLSerializer в XElement
Я работал с XML в базе данных LINQ и обнаружил, что очень сложно работать с сериализатором.
для базы данных LINQ требуется поле, которое хранит XElement
.
У меня есть сложный объект со многими настраиваемыми классами структуры, поэтому я хотел бы использовать XmlSerializer для сериализации объекта.
однако сериализатор может сериализоваться только в файл ("C:xxxxxx.xml") или поток памяти.
однако, чтобы преобразовать или сериализовать его быть XElement, чтобы я мог хранить в базе данных с помощью LINQ?
а как сделать обратное? т. е. десериализовать XElement...
4 ответов
попробуйте использовать это
using (var stream = new MemoryStream())
{
serializer.Serialize(stream, value);
stream.Position = 0;
using (XmlReader reader = XmlReader.Create(stream))
{
XElement element = XElement.Load(reader);
}
}
десериализовать :
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);
}
чтобы сделать то, что описывал Джон Сондерс, более явным, десериализация очень проста:
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.Фрагмент, который вызывает сбой 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;
}
во-первых, см. Сериализовать Способ чтобы увидеть, что сериализатор может обрабатывать больше, чем просто потоки памяти или файлы.
во-вторых, попробуйте использовать XElement.CreateWriter, а затем передает результирующий XmlWriter сериализатору.
SQL имеет тип данных XML может быть это может помочь вам посмотреть на в MSDN