对象反序列化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);
    }

对象反序列化XML类型转换错误

Deserialize()返回一个object。它将具有适当的类型,但由于c#是一种强类型语言(并且没有从objectLookUpCodeCollection的隐式强制转换),编译器不知道如何将结果赋值给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#泛型。