protected virtual object GetRootObject(object obj, IPropertyMap parent)
        {
            object rootObject = this.Context.ObjectManager.GetPropertyValue(obj, parent.Name);

            if (rootObject == null)
            {
                throw new NPathException("Can't serialize reference to inlined object with null reference in parent path!");                 // do not localize
            }
            IClassMap classMap = this.Context.DomainMap.MustGetClassMap(rootObject.GetType());

            parent = classMap.GetDocParentPropertyMap();

            if (parent != null)
            {
                rootObject = GetRootObject(rootObject,
                                           parent);
            }

            return(rootObject);
        }
        protected virtual void SerializeInlineReferenceElement(object obj, XmlNode xmlElement, object value)
        {
            IObjectManager om        = this.Context.ObjectManager;
            IDomainMap     domainMap = this.Context.DomainMap;
            IClassMap      classMap  = domainMap.MustGetClassMap(value.GetType());

            SetAttributeValue(xmlElement, "id", om.GetObjectIdentity(value));
            SetAttributeValue(xmlElement, "class", classMap.Name);

            IPropertyMap parent = classMap.GetDocParentPropertyMap();

            if (parent != null)
            {
                object rootObject = GetRootObject(value, parent);

                if (rootObject == null)
                {
                    throw new NPersistException("Could not find root object!");                     // do not localize
                }
                SetAttributeValue(xmlElement, "root-id", om.GetObjectIdentity(rootObject));
                SetAttributeValue(xmlElement, "root-class", domainMap.MustGetClassMap(rootObject.GetType()).Name);
            }
        }