using System.Collections.Generic;
using System.Xml.Serialization;
public static class XmlExtensions
public static T Deserialize<T>(this XContainer element, XmlSerializer serializer = null)
using (var reader = element.CreateReader())
object result = (serializer ?? new XmlSerializer(typeof(T))).Deserialize(reader);
public static XElement SerializeToXElement<T>(this T obj, XmlSerializer serializer = null)
var doc = new XDocument();
using (var writer = doc.CreateWriter())
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(writer, obj);
public static XName ContainerElementName { get { return (XName)"Object"; } }
public static XName ContainerAttributeName { get { return (XName)"Name"; } }
public static XElement SetItem<T>(this XDocument doc, string attributeValue, T obj)
return doc.SetItem(ContainerElementName, ContainerAttributeName, attributeValue, obj);
static XElement SetItem<T>(this XDocument doc, XName containerElementName, XName containerAttributeName, string attributeValue, T obj)
if (doc == null || containerElementName == null || containerAttributeName == null || attributeValue == null)
throw new ArgumentNullException();
throw new ArgumentException("doc.Root == null");
var container = doc.Root.Elements(containerElementName).Where(e => (string)e.Attribute(containerAttributeName) == attributeValue).SingleOrDefault();
container = new XElement(containerElementName, new XAttribute(containerAttributeName, attributeValue));
var element = obj.SerializeToXElement();
public static T GetItem<T>(this XDocument doc, string attributeValue)
return doc.GetItem<T>(ContainerElementName, ContainerAttributeName, attributeValue);
static T GetItem<T>(this XDocument doc, XName containerElementName, XName containerAttributeName, string attributeValue)
if (doc == null || containerElementName == null || containerAttributeName == null || attributeValue == null)
throw new ArgumentNullException();
throw new ArgumentException("doc.Root == null");
var container = doc.Root.Elements(containerElementName).Where(e => (string)e.Attribute(containerAttributeName) == attributeValue).SingleOrDefault();
var element = container.Elements().SingleOrDefault();
return element.Deserialize<T>();
public static XDocument CreateDefaultXDocument()
var xml = @"<StoredObjects></StoredObjects>";
return XDocument.Parse(xml);
public class MYOBJECT_TYPE
public string Value { get; set; }
public List<int> Values { get; set; }
public static void Test()
var doc = XmlExtensions.CreateDefaultXDocument();
var test1 = new MYOBJECT_TYPE { Value = "1hello", Values = new List<int> { 1, 11, 111, 1111, 11111 } };
var test3 = new MYOBJECT_TYPE { Value = "3hello", Values = new List<int> { 3, 33, 333, 3333, 33333 } };
var MYOBJECT = new MYOBJECT_TYPE { Value = "2hello", Values = new List<int> { 2, 22, 222, 2222, 22222 } };
string objectName = "second";
doc.SetItem("first", test1);
doc.SetItem(objectName, MYOBJECT);
doc.SetItem("third", test3);
var MYOBJECT2 = doc.GetItem<MYOBJECT_TYPE>("second");
CheckEqual(MYOBJECT2, MYOBJECT);
doc.SetItem("first", test1);
doc.SetItem(objectName, MYOBJECT);
doc.SetItem("third", test3);
var MYOBJECT3 = doc.GetItem<MYOBJECT_TYPE>("second");
CheckEqual(MYOBJECT3, MYOBJECT);
doc.SetItem("first", test1);
doc.SetItem(objectName, test1);
doc.SetItem("third", test3);
var test1back2 = doc.GetItem<MYOBJECT_TYPE>("second");
CheckEqual(test1back2, test1);
doc.SetItem("first", test1);
doc.SetItem(objectName, test3);
doc.SetItem("third", test3);
var MYOBJECT5 = doc.GetItem<MYOBJECT_TYPE>("second");
CheckEqual(MYOBJECT5, MYOBJECT);
Console.WriteLine("Caught expected exception");
doc.SetItem("first", test1);
doc.SetItem(objectName, MYOBJECT);
doc.SetItem("third", test3);
var MYOBJECT4 = doc.GetItem<MYOBJECT_TYPE>("second");
CheckEqual(MYOBJECT4, MYOBJECT);
static bool CheckEqual<T>(T first, T second)
if (object.ReferenceEquals(first, second))
if (first == null || second == null)
throw new InvalidOperationException();
if (!Newtonsoft.Json.Linq.JToken.DeepEquals(Newtonsoft.Json.Linq.JToken.FromObject(first), Newtonsoft.Json.Linq.JToken.FromObject(second)))
throw new InvalidOperationException();
public static void Main()