Beispiel #1
0
        private static void WriteNode(
            SerializeNode node,
            object value,
            ExceptionInfo exceptionInfo
            )
        {
            var typeInfo = value.GetObjTypeInfo();

            if (typeInfo.IsSerializePredefSingle())
            {
                throw new WritingFailureException(exceptionInfo, WritingFailureException.Reason_1);
            }
            if (value.IsSerializeObjectStruct())
            {
                foreach (var kvp in typeInfo.GetFieldsAndPropertiesWithAttributeDict <SerializeItemAttribute>())
                {
                    var member = kvp.Key;
                    var att    = kvp.Value[0];
                    if (att == null || att.SkipItem(member.GetValue(value)))
                    {
                        continue;
                    }
                    Write(node, att.SerializeName ?? member.Name, member.GetValue(value), member);
                }
            }
            else if (value.IsSerializeObjectCustom())
            {
                _save.Do(value, node);
            }
            else if (value.IsSerializeObjectSingle())
            {
                var member = typeInfo.GetSerializeObjectSingleMember();
                if (member == null)
                {
                    throw new WritingFailureException(exceptionInfo, WritingFailureException.Reason_0);
                }
                WriteNode(node, member.GetValue(value), member);
            }
            else if (typeInfo.IsGenericType)
            {
                if (typeInfo.IsList() || typeInfo.IsDict())
                {
                    var enumerator =
                        (IEnumerator)typeInfo.GetMethod("GetEnumerator").Invoke(value, null);
                    while (enumerator.MoveNext())
                    {
                        var item = enumerator.Current;
                        Write(node, "item", item, exceptionInfo);
                    }
                }
                else if (typeInfo.IsKeyValuePair())
                {
                    var key = value.GetObjTypeInfo().GetMethod("get_Key").Invoke(value, null);
                    Write(node, "key", key, exceptionInfo);
                    var val = value.GetObjTypeInfo().GetMethod("get_Value").Invoke(value, null);
                    Write(node, "value", val, exceptionInfo);
                }
            }
        }
Beispiel #2
0
 private static void LoadDefault(this object obj)
 {
     if (!obj.GetObjTypeInfo().IsSerializeObjectLoadDefaultType())
     {
         return;
     }
     logger.InternalDebug("Loading default value for object of type {0}", obj.GetType().FullName);
     _default.Do(obj);
 }
Beispiel #3
0
        private static object ReadNode(
            SerializeNode node,
            Type type,
            ExceptionInfo exceptionInfo
            )
        {
            var result   = CreateObject(type);
            var typeInfo = type.GetTypeInfo();

            if (result.IsSerializeObjectStruct())
            {
                foreach (var kvp in typeInfo.GetFieldsAndPropertiesWithAttributeDict <SerializeItemAttribute>())
                {
                    var member = kvp.Key;
                    var att    = kvp.Value[0];
                    if (att == null || att.Ignore)
                    {
                        continue;
                    }
                    ReadFieldOrProperty(result, member, node, att.SerializeName ?? member.Name);
                }
            }
            else if (result.IsSerializeObjectCustom())
            {
                _load.Do(result, node);
            }
            else if (result.IsSerializeObjectSingle())
            {
                var member = typeInfo.GetSerializeObjectSingleMember();
                if (member == null)
                {
                    throw new ParsingFailureException(exceptionInfo, ParsingFailureException.Reason_0);
                }
                var val = member.GetValue(result);
                if (val == null)
                {
                    val = CreateObject(member.GetValueType());
                }
                result = ReadNode(node, type, member);
                member.SetValue(result, val);
            }
            else if (typeInfo.IsGenericType)
            {
                Type[] paramTypes;
                if (typeInfo.IsList(out paramTypes))
                {
                    result = CreateObject(type);
                    var itemType = paramTypes[0];
                    if (node.ContainsItem("item"))
                    {
                        foreach (var value in node.GetItems("item"))
                        {
                            var      item = ReadItem(value, itemType, exceptionInfo);
                            object[] par  = { item };
                            typeInfo.GetMethod("Add").Invoke(result, par);
                        }
                    }
                    else if (node.ContainsNode("item"))
                    {
                        foreach (var itemNode in node.GetNodes("item"))
                        {
                            var      item = ReadNode(itemNode, paramTypes[0], exceptionInfo);
                            object[] par  = { item };
                            typeInfo.GetMethod("Add").Invoke(result, par);
                        }
                    }
                }
                else if (typeInfo.IsDict(out paramTypes))
                {
                    result = CreateObject(type);
                    var keyType   = paramTypes[0];
                    var valueType = paramTypes[1];
                    foreach (var itemNode in node.GetNodes("item"))
                    {
                        var      kvpType = typeof(KeyValuePair <,>).MakeGenericType(keyType, valueType).GetTypeInfo();
                        var      key     = Read(itemNode, "key", kvpType.GetProperty("Key"));
                        var      val     = Read(itemNode, "value", kvpType.GetProperty("Value"));
                        object[] par     = { key, val };
                        typeInfo.GetMethod("Add").Invoke(result, par);
                    }
                }
                else
                {
                    throw new TypeNotSupportedException(true, type);
                }
            }
            else
            {
                throw new TypeNotSupportedException(true, result.GetType());
            }
            return(result);
        }