public XmlElement SerializeObject(DomainObjectData xobj, XmlDocument xmlDoc, string[] aPreloadProperties)
        {
            PreloadsNavigator nav = null;

            if (aPreloadProperties != null)
            {
                nav = new PreloadsNavigator(aPreloadProperties);
            }
            return(serializeObject(xobj, xmlDoc, nav));
        }
        private XmlElement serializeObject(DomainObjectData xobj, XmlDocument xmlDoc, PreloadsNavigator nav)
        {
            XmlElement xmlObject = XMetadataManager.CreateObjectTemplate(xobj.TypeInfo, xmlDoc, false);//m_mdManager.CreateObjectTemplate(xobj.TypeInfo, xmlDoc, false);

            xmlObject.SetAttribute("oid", XmlConvert.ToString(xobj.ObjectID));
            if (xobj.IsNew)
            {
                xmlObject.SetAttribute("new", "1");
            }
            else if (xobj.TS > -1)
            {
                xmlObject.SetAttribute("ts", XmlConvert.ToString(xobj.TS));
            }
            if (nav != null)
            {
                nav.MoveNext();
            }
            foreach (XmlElement xmlProp in xmlObject.ChildNodes)
            {
                if (nav != null && nav.HasProp(xmlProp.LocalName))
                {
                    // развернуть объекты в свойстве
                    serializePropertyInternal(xobj, xmlProp, nav);
                }
                else
                {
                    // в свойстве только заглушки
                    serializePropertyInternal(xobj, xmlProp, null);
                }
            }
            if (nav != null)
            {
                nav.MoveBack();
            }
            return(xmlObject);
        }
        /// <summary>
        /// Добавляет значение в объектное свойство.
        /// Если объект-значение присутствует в контексте, то запускаем его сериализацию (serializeObject), иначе создаем болванку (тип+идентификатор)
        /// </summary>
        /// <param name="dataSet"></param>
        /// <param name="xmlProp">Текущее объектное свойство (скалярное или массивное)</param>
        /// <param name="propInfo">Метаданные свойства</param>
        /// <param name="valueOID">Идентификатор объекта-значения</param>
        private void addValueIntoObjectProp(DomainObjectDataSet dataSet, XmlElement xmlProp, XPropInfoObject propInfo, Guid valueOID, PreloadsNavigator nav)
        {
            XmlElement       xmlObjectValue;                    // xml-представление объект-значение
            DomainObjectData xobjValue = null;                  // объект-значение свойства в контексте

            // теоретически контекста может не быть
            if (dataSet != null && nav != null)
            {
                xobjValue = dataSet.Find(propInfo.ReferedType.Name, valueOID);
            }
            if (xobjValue != null && nav != null)
            {
                // Объект-значение свойства загружен в контекст и задан навигатор - запустим рекурсивно его сериализацию
                xmlObjectValue = serializeObject(xobjValue, xmlProp.OwnerDocument, nav);
            }
            else
            {
                xmlObjectValue = xmlProp.OwnerDocument.CreateElement(propInfo.ReferedType.Name);
                xmlObjectValue.SetAttribute("oid", valueOID.ToString());
            }
            // добавим объект-значение (буть-то ссылка или полный объект)
            xmlProp.AppendChild(xmlObjectValue);
        }
 /// <summary>
 /// Записывает данные объектного массивного свойства
 /// </summary>
 /// <param name="xobjOwner">владелец свойства</param>
 /// <param name="xmlProp">xml-свойство</param>
 /// <param name="vPropValue">Значение массивного свойства (null или Guid[])</param>
 /// <param name="nav">навигатор по список прогружаемых свойств</param>
 private void writeArrayProp(DomainObjectData xobjOwner, XmlElement xmlProp, object vPropValue, XPropInfoObject propInfo, PreloadsNavigator nav)
 {
     if (vPropValue == null)
     {
         if (!xobjOwner.IsNew)
         {
             xmlProp.SetAttribute("loaded", "0");
         }
     }
     else
     {
         // свойство есть и загруженное
         Guid[] oids = (Guid[])vPropValue;
         foreach (Guid valueOID in oids)
         {
             addValueIntoObjectProp(xobjOwner.Context, xmlProp, propInfo, valueOID, nav);
         }
     }
 }
        private void serializePropertyInternal(DomainObjectData xobj, XmlElement xmlProp, PreloadsNavigator nav)
        {
            DomainObjectDataSet dataSet = xobj.Context;
            string sPropName;
            object vPropValue;

            sPropName = xmlProp.LocalName;
            XPropInfoBase propInfo = xobj.TypeInfo.GetProp(sPropName);

            switch (propInfo.VarType)
            {
            case XPropType.vt_bin:
            case XPropType.vt_text:
                writeLOBProp(xobj, xmlProp, propInfo);
                break;

            case XPropType.vt_object:
                if (propInfo is XPropInfoObjectScalar)
                {
                    // скалярное свойство
                    if (xobj.IsNew)
                    {
                        vPropValue = xobj.GetUpdatedPropValue(sPropName);
                    }
                    else
                    {
                        vPropValue = xobj.GetLoadedPropValue(sPropName);
                    }

                    if (vPropValue != null && !(vPropValue is DBNull))
                    {
                        addValueIntoObjectProp(dataSet, xmlProp, (XPropInfoObjectScalar)propInfo, (Guid)vPropValue, nav);
                    }
                }
                else
                {
                    // массивное свойство
                    if (xobj.IsNew)
                    {
                        vPropValue = xobj.GetUpdatedPropValue(sPropName);
                    }
                    else
                    {
                        vPropValue = xobj.GetLoadedPropValue(sPropName);
                    }

                    writeArrayProp(xobj, xmlProp, vPropValue, (XPropInfoObject)propInfo, nav);
                }
                break;

            default:
                if (xobj.IsNew)
                {
                    vPropValue = xobj.GetUpdatedPropValue(sPropName);
                }
                else
                {
                    vPropValue = xobj.GetLoadedPropValue(sPropName);
                }

                if (vPropValue != null && !(vPropValue is DBNull))
                {
                    xmlProp.InnerText = XmlPropValueWriter.GetXmlTypedValue(vPropValue, propInfo.VarType);
                }
                else
                {
                    xmlProp.InnerText = String.Empty;
                }
                break;
            }
        }