C# 困难的反序列化方法IndexOutoFrangException
我写了一个程序,可以处理诸如删除和更新、存储和搜索以及所有客户、员工和订单等文件 但我的问题是,当调用反序列化方法时,我发现以下错误: 索引自动失效异常 我尝试过Try-Catch方法,但它会使程序变慢,从而降低其效率C# 困难的反序列化方法IndexOutoFrangException,c#,deserialization,C#,Deserialization,我写了一个程序,可以处理诸如删除和更新、存储和搜索以及所有客户、员工和订单等文件 但我的问题是,当调用反序列化方法时,我发现以下错误: 索引自动失效异常 我尝试过Try-Catch方法,但它会使程序变慢,从而降低其效率 public T反序列化(字符串实体) { var obj=Activator.CreateInstance(); var stringProps=entity.Split(','); var objProps=obj.GetType().GetProperties(); v
public T反序列化(字符串实体)
{
var obj=Activator.CreateInstance();
var stringProps=entity.Split(',');
var objProps=obj.GetType().GetProperties();
var-propIndex=0;
对于(int i=0;i
您没有检查您的ProIndex
是否在您的objProps
数组的范围内
您可以对代码进行以下更改:
for (int i = 0;
i < stringProps.Length - 1
&& propIndex < objProps.Length - 1; // <-- check wether you're in range
i++)
for(int i=0;
i
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;
}**
public T反序列化(字符串实体)
{
var obj=Activator.CreateInstance();
var stringProps=entity.Split(',');
**var str=删除空间(stringProps)**
var objProps=obj.GetType().GetProperties();
var-propIndex=0;
对于(int i=0;i
那么你的问题是什么?你想修复你的程序,使它工作并且不再抛出异常吗?或者你对异常没问题,只是想更有效地处理它吗?如果是后者,那么你可以只得到一个空的catch
。不过,我怀疑你有一个逻辑错误,你需要修复它。是的,你想吗修复您的程序,使其工作,不再引发该异常。编辑您的问题。显示您要初始化的示例类,并显示您尝试反序列化的数据示例。显示类定义和stringProps
数组的内容。这样可以避免错误,但不会使程序工作。I似乎OP对如何做他想做的事情有一个根本性的误解。是的,但他最初想要得到的是什么还不知道。当然他必须实现一种错误处理,就像catch子句中最好的那样。相反,你可以编写var stringProps=entity.Split(',',,StringSplitOptions.removemptyEntries);
请参见
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;
}**