Xml序列化错误:无法转换类型的对象

时间:2014-02-20 08:02:59

标签: c# serialization xml-serialization

有些人可以帮助解决我在一个环境中遇到的奇怪的序列化问题,并且它在所有环境中都能正常运行..但它在特定的环境中失败了......所以我在这里指定的很奇怪

代码

public SomeType[] Deserialize(string xml)
{
    XmlSerializer serializer = new XmlSerializer(typeof(SomeType[]));
    StringReader stringReader = new StringReader(xml);
    SomeType[] types = (SomeType[])serializer.Deserialize(stringReader);
    stringReader.Close();
    return types;
}

序列化的XML数据:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSomeType>
  <SomeType>
    <Field1>val</Field1>
    <Field2>val</Field2>
    <Field3>val</Field3>
  </SomeType>
</ArrayOfSomeType>

例外是:

  

System.InvalidCastException:无法将类型为'SomeType []'的对象强制转换为'SomeType'。

     

at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterSomeType.Write11_SomeType(Object o)

1 个答案:

答案 0 :(得分:1)

此处的错误是您未显示的Serialize方法。您的Deserialize方法可以正常运行。以下Serialize方法可以正常工作:

static string Serialize(SomeType[] values)
{
    using (var sw = new StringWriter())
    {
        var serializer = new XmlSerializer(typeof(SomeType[]));
        serializer.Serialize(sw, values);
        return sw.ToString();
    }
}

如果我不得不猜测,你有以下内容:

var serializer = new XmlSerializer(typeof(SomeType));

如果您希望 exact 相同的输出而没有不必要的名称空间别名声明,请将方法更改为包括:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
serializer.Serialize(sw, values, ns);

编辑显示当前代码正常工作:

using System;
using System.IO;
using System.Xml.Serialization;

public class SomeType
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}
public class MyTest
{
    public static SomeType[] Deserialize(string xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(SomeType[]));
        StringReader stringReader = new StringReader(xml);
        SomeType[] types = (SomeType[])serializer.Deserialize(stringReader);
        stringReader.Close();
        return types;
    }
    public static void Main()
    {
        string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<ArrayOfSomeType>
   <SomeType>
      <Field1>val</Field1>
      <Field2>val</Field2>
      <Field3>val</Field3>
   </SomeType>
</ArrayOfSomeType>";
        var items = Deserialize(xml);
        foreach (var item in items)
        {
            Console.WriteLine("{0}, {1}, {2}",
                item.Field1, item.Field2, item.Field3);
        }
    }
}