难以反序列化方法IndexOutOfRangeException

时间:2013-11-27 16:25:15

标签: c# deserialization

我编写了一个程序,可以处理删除和更新,存储和搜索等文件以及所有客户,员工和订单......

但我的问题是deserialize方法你知道什么时候它被称为我得到这个错误:

IndexOutOfRangeException

我尝试过Try Catch方法但它会使程序变慢n会降低效率

Project Files

Video

   public T Deserialize<T>(string entity)
    {
        var obj = Activator.CreateInstance<T>();
        var stringProps = entity.Split(',');
        var objProps = obj.GetType().GetProperties();

        var propIndex = 0;

        for (int i = 0; i < stringProps.Length - 1; i++)
        {
            try
            {
                if (objProps[propIndex].PropertyType.FullName == "System.String")
                {
                    objProps[propIndex].SetValue(obj, stringProps[i], null);
                }

                else if (objProps[propIndex].PropertyType.FullName == "System.Int32")
                {
                    objProps[propIndex].SetValue(obj, Convert.ToInt32(stringProps[i]), null);
                }
                else if (objProps[propIndex].PropertyType.FullName == "System.DateTime")
                {
                    var cultureInfo = new CultureInfo("fa-IR");
                    DateTime dateTime = Convert.ToDateTime(stringProps[i], cultureInfo);
                    objProps[propIndex].SetValue(obj, dateTime, null);
                }
                else if (objProps[propIndex].PropertyType.FullName == "System.boolean")
                {
                    objProps[propIndex].SetValue(obj, Convert.ToBoolean(stringProps[i]), null);
                }

                else
                {
                    i--;
                }
                propIndex++;
            }

            catch (IndexOutOfRangeException)
            {
                Debug.WriteLine("Index Out Of range");
            }
        }
        return obj;
    }

2 个答案:

答案 0 :(得分:1)

您错过了检查propIndex是否在objProps阵列的范围内。

您可以对代码进行以下更改:

for (int i = 0;
     i < stringProps.Length - 1 
         && propIndex < objProps.Length - 1; // <-- check wether you're in range
     i++)

另一种方法是将try catch块放在for循环之外,以便在stringProps开始出现时不再迭代IndexOutOfRangeException

这样就可以记录错误。

答案 1 :(得分:1)

我写了一个函数(deletespace),它的任务是删除字符串中的空格,并且用这个方法解决了问题。

 public T Deserialize<T>(string entity)
    {
        var obj = Activator.CreateInstance<T>();
        var stringProps = entity.Split(',');
        **var str = deletespace(stringProps);**
        var objProps = obj.GetType().GetProperties();

        var propIndex = 0;

        for (int i = 0; i < str.Count; i++)
        {
            try
            {
                if (objProps[propIndex].PropertyType.FullName == "System.String")
                {
                    objProps[propIndex].SetValue(obj, stringProps[i], null);
                }

                else if (objProps[propIndex].PropertyType.FullName == "System.Int32")
                {
                    objProps[propIndex].SetValue(obj, Convert.ToInt32(stringProps[i]), null);
                }
                else if (objProps[propIndex].PropertyType.FullName == "System.DateTime")
                {
                    var cultureInfo = new CultureInfo("fa-IR");
                    DateTime dateTime = Convert.ToDateTime(stringProps[i], cultureInfo);
                    objProps[propIndex].SetValue(obj, dateTime, null);
                }
                else if (objProps[propIndex].PropertyType.FullName == "System.Boolean")
                {
                    objProps[propIndex].SetValue(obj, Convert.ToBoolean(stringProps[i]), null);
                }

                else
                {
                    i--;
                }
                propIndex++;
            }

            catch (IndexOutOfRangeException)
            {
                Debug.WriteLine("Index Out Of range");
            }
        }
        return obj;
    }

    **private List<string> deletespace(string[] spaceStrings)
    {
        var lststr = new List<string>();
        for (int i = 0; i < spaceStrings.Length; i++)
        {
            if (spaceStrings[i] != "")
            {
                lststr.Add(spaceStrings[i]);
            }
        }
        return lststr;
    }**