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

use*_*475 2 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;
}
Run Code Online (Sandbox Code Playgroud)

序列化 XML 数据:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSomeType>
  <SomeType>
    <Field1>val</Field1>
    <Field2>val</Field2>
    <Field3>val</Field3>
  </SomeType>
</ArrayOfSomeType>
 
Run Code Online (Sandbox Code Playgroud)

例外的是:

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

在 Microsoft.Xml.Serialization.GenerateAssembly.XmlSerializationWriterSomeType.Write11_SomeType(对象 o)

Mar*_*ell 5

这里的错误是在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我必须猜测的话,你有以下内容:

var serializer = new XmlSerializer(typeof(SomeType));
Run Code Online (Sandbox Code Playgroud)

如果您想要完全相同的输出而无需不必要的命名空间别名声明,请更改该方法以包括:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
serializer.Serialize(sw, values, ns);
Run Code Online (Sandbox Code Playgroud)

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)