对象反序列化XML类型转换错误
本文关键字:错误 类型转换 XML 反序列化 对象 | 更新日期: 2023-09-27 18:09:42
我得到一个错误不能隐式地将类型'object'转换为'LookUpCodeCollection'。存在显式转换(您是否缺少强制转换?)当我调用
下面这行代码的方法时 obj = Deserialize(xml.ToString(), typeof(LookUpCodeCollection));
这是LookUpCode对象
[System.Serializable()]
public class LookUpCode
{
#region "Member Variables"
private int mCodeID;
private int? mCategoryID;
private string mLookUpDescription;
#endregion
#region "Properties"
public int CodeID
{
get { return mCodeID; }
set { mCodeID = value; }
}
public int? CategoryID
{
get { return mCategoryID; }
set { mCategoryID = value; }
}
public string LookUpDescription
{
get { return mLookUpDescription; }
set { mLookUpDescription = value; }
}
#endregion
}
}
LookUpCodeCollection
using System;
using System.Collections.Generic;
[System.Serializable()]
public class LookUpCodeCollection : System.Collections.ObjectModel.Collection<LookUpCode>, IList<LookUpCode>
{
}
的XML- <ArrayOfLookUpCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <LookUpCode>
<CodeID>1</CodeID>
<CategoryID>1</CategoryID>
<LookUpDescription>States</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>2</CodeID>
<CategoryID>2</CategoryID>
<LookUpDescription>Connecticut Cities by Zipcode</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>3</CodeID>
<CategoryID>3</CategoryID>
<LookUpDescription>Zipcode Connecticut Cities</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>4</CodeID>
<CategoryID>4</CategoryID>
<LookUpDescription>ContactType</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>5</CodeID>
<CategoryID>5</CategoryID>
<LookUpDescription>PhoneType</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>6</CodeID>
<CategoryID>6</CategoryID>
<LookUpDescription>DocumentGenerationType</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>7</CodeID>
<CategoryID>7</CategoryID>
<LookUpDescription>AmendmentType</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>8</CodeID>
<CategoryID>8</CategoryID>
<LookUpDescription>ContractorsTown_TownCodes</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>9</CodeID>
<CategoryID>9</CategoryID>
<LookUpDescription>Status</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>10</CodeID>
<CategoryID>10</CategoryID>
<LookUpDescription>Upload Document Types</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>11</CodeID>
<CategoryID>11</CategoryID>
<LookUpDescription>ExpirationWarning</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>12</CodeID>
<CategoryID>12</CategoryID>
<LookUpDescription>RenewalInterval</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>13</CodeID>
<CategoryID>13</CategoryID>
<LookUpDescription>Reports</LookUpDescription>
</LookUpCode>
- <LookUpCode>
<CodeID>14</CodeID>
<CategoryID>14</CategoryID>
<LookUpDescription>ActiveInactive</LookUpDescription>
</LookUpCode>
</ArrayOfLookUpCode>
对反序列化方法的调用
//Declare the variables
LookUpCodeCollection obj = new LookUpCodeCollection();
obj = Deserialize(xml.ToString(), typeof(LookUpCodeCollection));
反序列化方法
private static object Deserialize(string input, Type toType)
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(toType);
using (StringReader sr = new StringReader(input))
return ser.Deserialize(sr);
}
Deserialize()
返回一个object
。它将具有适当的类型,但由于c#是一种强类型语言(并且没有从object
到LookUpCodeCollection
的隐式强制转换),编译器不知道如何将结果赋值给LookUpCodeCollection
类型的变量。正如错误提示的那样,您需要显式地强制转换它:
LookUpCodeCollection obj = (LookUpCodeCollection)Deserialize(xml.ToString(), typeof(LookUpCodeCollection));
或者你可以让你的Deserialize
方法通用:
private static T Deserialize<T>(string input)
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
using (StringReader sr = new StringReader(input))
return (T)ser.Deserialize(sr);
}
您需要再次将反序列化的结果强制转换为LookUpCodeCollection
:
(LookUpCodeCollection)ser.Deserialize(sr);
尽管您的obj
对象具有正确的类型,但Deserialize
方法的返回类型是object
,因此它没有被强制转换为所需的结果类型。您可以将反序列化方法的返回类型更改为LookUpCodeCollection
,反序列化应该可以工作(无需进一步更改代码):
private static LookUpCodeCollection Deserialize(string input, Type toType)
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(toType);
using (StringReader sr = new StringReader(input))
{
return (LookUpCodeCollection)ser.Deserialize(sr);
}
}
为了更灵活,常见的方法(在本例中为Deserialize
)通常使用。net Framework - Object中所有类的最终基类,因此在这种情况下(在本例中为LookUpCodeCollection
),您需要始终转换为派生类型。
如果你想用不同的数据类型重用你的反序列化函数,那就看看c#泛型。