コード例 #1
0
        private void DeserializeNodeToCollection(IEnumerable <XElement> valueNodes, XmlDeserializeContext context, Action <int, object> action)
        {
            int i = 0;

            foreach (XElement item in valueNodes)
            {
                object itemData = null;

                string elementID = item.Attribute("v").Value;

                if (item.AttributeWithAlterName("isRef", "r", false) == true)
                {
                    XElement objectElement = GetObjectElementByID(context.RootElement, item.AttributeWithAlterName("value", "v", 0));
                    itemData = DeserializeNodeToObject(objectElement, false, context);
                }
                else
                {
                    Type type = context.GetTypeInfo(item.AttributeWithAlterName("ownerTypeID", "oti", string.Empty));

                    itemData = item.AttributeWithAlterName("value", "v", TypeCreator.GetTypeDefaultValue(type));

                    itemData = DataConverter.ChangeType(itemData, type);
                }

                action(i, itemData);

                i++;
            }
        }
コード例 #2
0
        private object DeserializeNodeToObject(XElement objectNode, bool ignoreError, XmlDeserializeContext context)
        {
            object data = null;

            int objID = objectNode.Attribute("id", 0);

            if (context.ObjectContext.TryGetValue(objID, out data) == false)
            {
                try
                {
                    Type type = context.GetTypeInfo(objectNode.AttributeValueWithAlterName("ownerTypeID", "oti"));

                    XElementFieldSerializeAttribute attr = AttributeHelper.GetCustomAttribute <XElementFieldSerializeAttribute>(type);

                    if (attr != null && attr.IgnoreDeserializeError == true)
                    {
                        ignoreError = attr.IgnoreDeserializeError;
                    }

                    data = CreateSerializableInstance(type);

                    context.ObjectContext.Add(objID, data);

                    if ((data is IXElementSerializable) && objectNode.Attribute("cs", false) == true)
                    {
                        ((IXElementSerializable)data).Deserialize(objectNode, context);
                    }
                    else
                    {
                        string objectValue = objectNode.Element("Value", string.Empty);

                        if (objectValue.IsNotEmpty())
                        {
                            SerializationBinder binder = this.Binder ?? UnknownTypeStrategyBinder.Instance;

                            data = SerializationHelper.DeserializeStringToObject(objectValue, SerializationFormatterType.Binary, binder);
                        }
                        else
                        {
                            DeserializeNodesToProperties(objectNode, data, context);
                        }
                    }

                    if (data is IXmlDeserialize)
                    {
                        ((IXmlDeserialize)data).AfterDeserialize(context);
                    }
                }
                catch (System.Exception)
                {
                    if (ignoreError == false)
                    {
                        throw;
                    }
                }
            }

            return(data);
        }
コード例 #3
0
        private void DeserializeNodeToCollection(IEnumerable<XElement> valueNodes, XmlDeserializeContext context, Action<int, object> action)
        {
            int i = 0;

            foreach (XElement item in valueNodes)
            {
                object itemData = null;

                string elementID = item.Attribute("v").Value;

                if (item.AttributeWithAlterName("isRef", "r", false) == true)
                {
                    XElement objectElement = GetObjectElementByID(context.RootElement, item.AttributeWithAlterName("value", "v", 0));
                    itemData = DeserializeNodeToObject(objectElement, false, context);
                }
                else
                {
                    Type type = context.GetTypeInfo(item.AttributeWithAlterName("ownerTypeID", "oti", string.Empty));

                    itemData = item.AttributeWithAlterName("value", "v", TypeCreator.GetTypeDefaultValue(type));

                    itemData = DataConverter.ChangeType(itemData, type);
                }

                action(i, itemData);

                i++;
            }
        }
コード例 #4
0
        private object DeserializeNodeToObject(XElement objectNode, bool ignoreError, XmlDeserializeContext context)
        {
            object data = null;

            int objID = objectNode.Attribute("id", 0);

            if (context.ObjectContext.TryGetValue(objID, out data) == false)
            {
                try
                {
                    Type type = context.GetTypeInfo(objectNode.AttributeValueWithAlterName("ownerTypeID", "oti"));

                    XElementFieldSerializeAttribute attr = AttributeHelper.GetCustomAttribute<XElementFieldSerializeAttribute>(type);

                    if (attr != null && attr.IgnoreDeserializeError == true)
                        ignoreError = attr.IgnoreDeserializeError;

                    data = CreateSerializableInstance(type);

                    context.ObjectContext.Add(objID, data);

                    if ((data is IXElementSerializable) && objectNode.Attribute("cs", false) == true)
                    {
                        ((IXElementSerializable)data).Deserialize(objectNode, context);
                    }
                    else
                    {
                        string objectValue = objectNode.Element("Value", string.Empty);

                        if (objectValue.IsNotEmpty())
                        {
                            SerializationBinder binder = this.Binder ?? UnknownTypeStrategyBinder.Instance;

                            data = SerializationHelper.DeserializeStringToObject(objectValue, SerializationFormatterType.Binary, binder);
                        }
                        else
                        {
                            DeserializeNodesToProperties(objectNode, data, context);
                        }
                    }

                    if (data is IXmlDeserialize)
                        ((IXmlDeserialize)data).AfterDeserialize(context);
                }
                catch (System.Exception)
                {
                    if (ignoreError == false)
                        throw;
                }
            }

            return data;
        }