コード例 #1
0
 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();
 }
コード例 #2
0
        private string Serialize(object obj, int depth, string key)
        {
            if (obj == null)
            {
                return("");
            }
            var           type = obj.GetType();
            StringBuilder stringBuilderInstance;

            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))
            {
                var genericArgument = type.GenericTypeArguments.Length == 0
                    ? type.GetElementType()
                    : type.GenericTypeArguments[0];
                if (key == "")
                {
                    key = $"{type.Name}_{genericArgument.Name}";
                }
                stringBuilderInstance = new StringBuilder($"{new string('\t', depth)}<{key}>\n");
                foreach (var el in (IEnumerable)obj)
                {
                    stringBuilderInstance.Append(Serialize(el, depth + 1, genericArgument.Name));
                }
                stringBuilderInstance.AppendLine($"{new string('\t', depth)}</{key}>");
            }
            else
            {
                key = key == "" ? type.Name : key;
                stringBuilderInstance = new StringBuilder($"{new string('\t', depth)}<{key}>\n");
                MemberInfo[] members = type.GetFields();
                members = members.Concat(type.GetProperties()).ToArray();
                var 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;
                    }
                    var value = Serialize(ParserUtils.GetMemberValue(obj, member.Name), depth + 1, member.Name);
                    if (counter == members.Length - 1)
                    {
                        value = value.TrimEnd('\t', '\n', ' ');
                    }
                    stringBuilderInstance.Append(value);
                    counter++;
                }

                stringBuilderInstance.AppendLine($"\n{new string('\t', depth)}</{key}>");
            }

            return(stringBuilderInstance.ToString());
        }
コード例 #3
0
        private static string Serialize(object obj, int depth)
        {
            if (obj == null)
            {
                return("");
            }
            var           type = obj.GetType();
            StringBuilder stringBuilderInstance;

            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))
            {
                var isComplex = false;
                stringBuilderInstance = new StringBuilder("");
                var counter          = 0;
                var collectionLength = ParserUtils.CollectionLength((IEnumerable)obj);
                foreach (var subObj in (IEnumerable)obj)
                {
                    if (subObj == null)
                    {
                        continue;
                    }
                    var value = $"{Serialize(subObj, depth + 1)}";
                    if (value.Trim('\t', '\n', ' ').First() == '{')
                    {
                        isComplex = true;
                    }
                    if (counter < collectionLength - 1)
                    {
                        value  = value.TrimEnd('\n');
                        value += ',';
                    }

                    stringBuilderInstance.Append(value);
                    counter++;
                }

                if (isComplex)
                {
                    stringBuilderInstance.Insert(0, $"\n{new string('\t', depth)}[");
                    stringBuilderInstance.AppendLine();
                    stringBuilderInstance.Append($"{new string('\t', depth)}]");
                }
                else
                {
                    stringBuilderInstance.Insert(0, "[");
                    stringBuilderInstance.Append("]");
                }
            }
            else
            {
                stringBuilderInstance = new StringBuilder($"\n{new string('\t', depth)}{{\n");
                MemberInfo[] members = type.GetProperties();
                members = members.Concat(type.GetFields()).ToArray();
                var counter = 0;
                var 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;
                    }
                    var value = $"{Serialize(ParserUtils.GetMemberValue(obj, member.Name), depth + 1)}";
                    stringBuilderInstance.Append($"{new string('\t', depth + 1)}\"{member.Name}\" : {value}"
                                                 .TrimEnd('\n')); //           "name" : { field }
                    if (counter != length - 1)
                    {
                        stringBuilderInstance.Append(',');
                    }
                    stringBuilderInstance.AppendLine();
                    ++counter;
                }

                stringBuilderInstance.Append($"{new string('\t', depth)}}}\n");
            }

            return(stringBuilderInstance.ToString());
        }