【问题标题】:Object Deserialization XML Type Cast Error对象反序列化 XML 类型转换错误
【发布时间】:2015-08-25 16:37:22
【问题描述】:

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

    }
}

查找代码集合

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);
    }

【问题讨论】:

    标签: c# .net xml serialization xml-deserialization


    【解决方案1】:

    Deserialize() 返回一个object。它将是适当的类型,但由于 C# 是一种强类型语言(并且没有从 objectLookUpCodeCollection 的隐式转换),编译器不知道如何将结果分配给 @ 类型的变量987654325@。正如错误所暗示的那样,您需要明确地转换它:

    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);
    }
    

    【讨论】:

      【解决方案2】:

      你需要再次将反序列化的结果转换为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)经常使用the ultimate base class of all classes in the .NET Framework - Object,因此在这种情况下您需要始终转换为派生类型(在您的情况下为LookUpCodeCollection)。

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

      【讨论】:

      • 我正在尝试进行类型转换,以便可以为许多不同的对象类型重用 Deserialize 方法。
      • 然后是@lc的通用解决方案。在这里更合适。
      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多