/// <summary> /// Loads an object from the specified XML element. /// </summary> /// <param name="resolver">A custom <see cref="ObjectLoaderMemberResolutionHandler"/> which allows external /// code to optionally resolve deserialized member values.</param> /// <param name="type">The type of object to load.</param> /// <param name="xml">The XML element that contains the object data.</param> /// <param name="culture">The culture information to use when parsing values.</param> /// <param name="ignoreMissingMembers">A value indicating whether the object loader /// should ignore members which do not exist on the type.</param> /// <returns>The object that was loaded.</returns> public Object LoadObject(ObjectLoaderMemberResolutionHandler resolver, Type type, XElement xml, CultureInfo culture, Boolean ignoreMissingMembers = false) { Contract.Require(type, nameof(type)); Contract.Require(xml, nameof(xml)); Contract.Require(culture, nameof(culture)); var state = new ObjectLoaderState(globalAliases, culture, resolver); state.IgnoreMissingMembers = ignoreMissingMembers; state.ParseClassAliases(null, type); var objectElement = xml; var objectInstance = CreateObjectFromRootElement(state, type, objectElement); return(PopulateObject(state, objectInstance, objectElement)); }
/// <summary> /// Loads object definitions contained in the specified XML document. /// </summary> /// <typeparam name="T">The type of object to load.</typeparam> /// <param name="root">The root data element of the document that contains the object definitions to load.</param> /// <param name="aliases">The elements defining class aliases.</param> /// <param name="defaults">The elements defining class defaults.</param> /// <param name="name">The name of the type of object to load, which corresponds to the names of the elements in the XML file.</param> /// <param name="defaultClass">The name of the default class to apply to loaded objects.</param> public IEnumerable <T> LoadDefinitions <T>(XElement root, IEnumerable <XElement> aliases, IEnumerable <XElement> defaults, String name, Type defaultClass) where T : DataObject { Contract.Require(root, nameof(root)); Contract.Require(name, nameof(name)); var cultureString = (String)root.Attribute("Culture"); var culture = String.IsNullOrWhiteSpace(cultureString) ? CultureInfo.InvariantCulture : new CultureInfo(cultureString); try { lockobj.EnterReadLock(); var state = new ObjectLoaderState(globalAliases, culture); state.ParseClassAliases(aliases, defaultClass); state.ParseClassDefaults(defaults); var objectElements = root.Elements(name); var objectList = new List <T>(); foreach (var objectElement in objectElements) { var objectInstance = (T)CreateObjectFromRootElement(state, typeof(T), objectElement); PopulateObject(state, objectInstance, objectElement); objectList.Add(objectInstance); } return(objectList); } finally { if (lockobj.IsReadLockHeld) { lockobj.ExitReadLock(); } } }