Beispiel #1
0
        static T Deserialize <T>(List <DeserializableObject> objects)
        {
            T    result;
            Type type = typeof(T);

            if (objects.First().ObjType == DeserializableObject.ObjectType.Primitive &&
                objects.Count == 1 &&
                objects.First().Key == "")
            {
                return((T)Convert.ChangeType(objects.First().Value.Trim('\"'), type));
            }
            if (ParserUtils.IsEnumerable(type) && objects.Count > 0)
            {
                objects.First().ObjType = DeserializableObject.ObjectType.Collection;
                return((T)GetEnumerableInstance(objects.First(), type));
            }
            result = (T)Activator.CreateInstance(type);
            foreach (var obj in objects)
            {
                string key        = obj.Key;
                string value      = obj.Value.Trim('\"');
                Type   memberType = ParserUtils.GetMemberType(type, key);
                if (obj.ObjType == DeserializableObject.ObjectType.Primitive)
                {
                    object converted;
                    if (memberType.IsEnum)
                    {
                        converted = Enum.Parse(memberType, value);
                    }
                    else
                    {
                        converted = Convert.ChangeType(value, memberType);
                    }
                    ParserUtils.SetMemberValue(result, key, converted);
                }
                else if (obj.ObjType == DeserializableObject.ObjectType.ComplexObject)
                {
                    if (ParserUtils.IsEnumerable(ParserUtils.GetMemberType(type, key)))
                    {
                        if (ParserUtils.IsEnumerable(memberType))
                        {
                            ParserUtils.SetMemberValue(result, key, GetEnumerableInstance(obj, memberType));
                        }
                    }
                    else
                    {
                        object parsed = typeof(XmlParser).GetMethod("Deserialize", BindingFlags.NonPublic | BindingFlags.Static)
                                        .MakeGenericMethod(memberType)
                                        .Invoke(null, new object[] { Parse(value, false) });
                        ParserUtils.SetMemberValue(result, key, parsed);
                    }
                }
                else
                {
                    if (ParserUtils.IsEnumerable(memberType))
                    {
                        ParserUtils.SetMemberValue(result, key, GetEnumerableInstance(obj, memberType));
                    }
                    else
                    {
                        throw new Exception("Invalid deserialization");
                    }
                }
            }
            return(result);
        }
Beispiel #2
0
        static string Serialize(object obj, int depth, string key)
        {
            if (obj == null)
            {
                return("");
            }
            Type          type = obj.GetType();
            StringBuilder sb;

            if (type.GetCustomAttribute(typeof(NonSerializedAttribute)) != null ||
                type.GetCustomAttribute(typeof(XmlIgnore)) != null ||
                type.GetCustomAttribute(typeof(ParseIgnore)) != null)
            {
                return("");
            }
            if (type.IsPrimitive ||
                type.IsEnum ||
                type == typeof(string))
            {
                key = (key == "") ? type.Name : key;
                return((new StringBuilder($"{new string('\t', depth)}<{key}>{obj}</{key}>\n")).ToString());
            }
            if (ParserUtils.IsEnumerable(type))
            {
                Type genericArgument = (type.GenericTypeArguments.Length == 0) ? type.GetElementType() : type.GenericTypeArguments[0];
                if (key == "")
                {
                    key = $"{type.Name}_{genericArgument.Name}";
                }
                sb = new StringBuilder($"{new string('\t', depth)}<{key}>\n");
                foreach (object el in (IEnumerable)obj)
                {
                    sb.Append(Serialize(el, depth + 1, genericArgument.Name));
                }
                sb.AppendLine($"{new string('\t', depth)}</{key}>");
            }
            else
            {
                key = (key == "") ? type.Name : key;
                sb  = new StringBuilder($"{new string('\t', depth)}<{key}>\n");
                MemberInfo[] members = type.GetFields();
                members = members.Concat(type.GetProperties()).ToArray();
                int counter = 0;
                foreach (var member in members)
                {
                    if (member.GetCustomAttribute(typeof(XmlIgnore)) != null || member.GetCustomAttribute(typeof(ParseIgnore)) != null ||
                        member.GetCustomAttribute(typeof(NonSerializedAttribute)) != null || ParserUtils.GetMemberValue(obj, member.Name) == null)
                    {
                        continue;
                    }
                    string value = Serialize(ParserUtils.GetMemberValue(obj, member.Name), depth + 1, member.Name);
                    if (counter == members.Length - 1)
                    {
                        value = value.TrimEnd(new char[] { '\t', '\n', ' ' });
                    }
                    sb.Append(value);
                    counter++;
                }
                sb.AppendLine($"\n{new string('\t', depth)}</{key}>");
            }
            return(sb.ToString());
        }
Beispiel #3
0
        static string Serialize(object obj, int depth)
        {
            if (obj == null)
            {
                return("");
            }
            Type          type = obj.GetType();
            StringBuilder sb;

            if (type.GetCustomAttribute(typeof(JsonIgnore)) != null || type.GetCustomAttribute(typeof(ParseIgnore)) != null ||
                type.GetCustomAttribute(typeof(NonSerializedAttribute)) != null)
            {
                return("");
            }
            if (type.IsPrimitive || type.IsEnum)
            {
                return($"{obj}");
            }
            if (type == typeof(string))
            {
                return($"\"{obj}\"");
            }
            if (ParserUtils.IsEnumerable(type))
            {
                bool isComplex = false;
                sb = new StringBuilder("");
                int counter          = 0;
                int collectionLength = ParserUtils.CollectionLength((IEnumerable)obj);
                foreach (var subObj in (IEnumerable)obj)
                {
                    if (subObj == null)
                    {
                        continue;
                    }
                    string value = $"{Serialize(subObj, depth + 1)}";
                    if (value.Trim(new char[] { '\t', '\n', ' ' }).First() == '{')
                    {
                        isComplex = true;
                    }
                    if (counter < collectionLength - 1)
                    {
                        value  = value.TrimEnd('\n');
                        value += ',';
                    }
                    sb.Append(value);
                    counter++;
                }
                if (isComplex)
                {
                    sb.Insert(0, $"\n{new string('\t', depth)}[");
                    sb.AppendLine();
                    sb.Append($"{new string('\t', depth)}]");
                }
                else
                {
                    sb.Insert(0, "[");
                    sb.Append("]");
                }
            }
            else
            {
                sb = new StringBuilder($"\n{new string('\t', depth)}{{\n");
                MemberInfo[] members = type.GetProperties();
                members = members.Concat(type.GetFields()).ToArray();
                int counter = 0;
                int length  = members.Length;
                foreach (var member in members)
                {
                    if (member.GetCustomAttribute(typeof(JsonIgnore)) != null || member.GetCustomAttribute(typeof(ParseIgnore)) != null ||
                        member.GetCustomAttribute(typeof(NonSerializedAttribute)) != null || ParserUtils.GetMemberValue(obj, member.Name) == null)
                    {
                        continue;
                    }
                    string value = $"{Serialize(ParserUtils.GetMemberValue(obj, member.Name), depth + 1)}";
                    sb.Append($"{new string('\t', depth + 1)}\"{member.Name}\" : {value}".TrimEnd('\n'));  //           "name" : { field }
                    if (counter != length - 1)
                    {
                        sb.Append(',');
                    }
                    sb.AppendLine();
                    ++counter;
                }
                sb.Append($"{new string('\t', depth)}}}\n");
            }
            return(sb.ToString());
        }