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; } }