C# Xml序列化错误:无法强制转换类型为的对象

C# Xml序列化错误:无法强制转换类型为的对象,c#,serialization,xml-serialization,C#,Serialization,Xml Serialization,有人能帮我解决一个奇怪的序列化问题吗?我在一个环境中遇到了这个问题,它在所有环境中都能正常工作。但是它在一个特定的环境中失败了。所以我在这里指定为奇怪 代码 序列化的XML数据: <?xml version="1.0" encoding="utf-8"?> <ArrayOfSomeType> <SomeType> <Field1>val</Field1> <Field2&

有人能帮我解决一个奇怪的序列化问题吗?我在一个环境中遇到了这个问题,它在所有环境中都能正常工作。但是它在一个特定的环境中失败了。所以我在这里指定为奇怪

代码

序列化的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”

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


这里的错误在未显示的
Serialize
方法中。您的
反序列化
方法可以正常工作。以下
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));
如果希望在没有不必要的命名空间别名声明的情况下获得完全相同的输出,请将该方法更改为包含:

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);
        }
    }
}
使用系统;
使用System.IO;
使用System.Xml.Serialization;
公共类SomeType
{
公共字符串字段1{get;set;}
公共字符串字段2{get;set;}
公共字符串字段3{get;set;}
}
公共类MyTest
{
公共静态SomeType[]反序列化(字符串xml)
{
XmlSerializer serializer=新的XmlSerializer(typeof(SomeType[]);
StringReader StringReader=新的StringReader(xml);
SomeType[]类型=(SomeType[])序列化程序。反序列化(stringReader);
stringReader.Close();
返回类型;
}
公共静态void Main()
{
字符串xml=@“
瓦尔
瓦尔
瓦尔
";
var items=反序列化(xml);
foreach(项目中的var项目)
{
Console.WriteLine(“{0},{1},{2}”,
项目现场1、项目现场2、项目现场3);
}
}
}

该错误似乎出现在序列化中,而不是反序列化中。您能显示serialize方法吗?我无法重现该问题,因此错误必须来自其他地方。很可能是@MarcGravel在序列化方法中提出的。@user3331475那么,关于它失败的“特定环境”,您能告诉我们什么?给我们一个线索。。。(我仍然认为显示的错误消息来自
序列化
,而不是
反序列化
)您好,谢谢您的回答..我没有序列化方法..因为xml来自外部系统..我需要typeof(SomeType[])而不是typeof(SomeType)@user3331475您显示的代码中没有错误;它很好用。你能提供一个简短但可运行的例子来说明这个问题吗?但是我再说一遍:我不认为您显示的错误来自于反序列化
XmlSerializationWriterSomeType.Write11\u SomeType(对象o)
听起来很像一个
序列化
调用。我对
typeof(SomeType)
的观点是,这就是我怀疑您在
Serialize
中做错的地方。我知道您实际上想要
SomeType[]
@user3331475作为我所说的简短但可运行的示例,请参阅我的编辑-它显示您的
反序列化
方法与您引用的xml配合得很好。我编辑了问题..我忘了指定它仅在特定环境中失败..您好..您是对的。问题处于序列化状态,而不是反序列化状态,因为我在错误的位置进行了检查。问题已解决。谢谢
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);
        }
    }
}