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

Object Deserialization XML Type Cast Error

我收到一个错误 无法将类型 '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);
    }

您需要再次将反序列化的结果转换为 LookUpCodeCollection

(LookUpCodeCollection)ser.Deserialize(sr);

虽然您的 obj 对象具有正确的类型,但 Deserialize 方法的 return 类型是 object,因此它不会转换为所需的结果类型。您可以将反序列化方法的 return 类型更改为 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)经常使用 the ultimate base class of all classes in the .NET Framework - Object,因此在这种情况下您需要始终转换为派生类型(在您的情况中LookUpCodeCollection)。

如果您想对不同的数据类型重用反序列化函数,请查看 C# Generics

Deserialize() returns 一个 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);
}