C# xmlns='';反序列化嵌套类时不应出现

C# xmlns='';反序列化嵌套类时不应出现,c#,.net,xml,xml-serialization,C#,.net,Xml,Xml Serialization,我在尝试序列化服务器上的类、将其发送到客户端并在目标上反序列化时遇到问题 在服务器上,我有以下两个类: [XmlRoot("StatusUpdate")] public class GameStatusUpdate { public GameStatusUpdate() {} public GameStatusUpdate(Player[] players, Command command) { this.Players = players;

我在尝试序列化服务器上的类、将其发送到客户端并在目标上反序列化时遇到问题

在服务器上,我有以下两个类:

[XmlRoot("StatusUpdate")]
public class GameStatusUpdate
{
    public GameStatusUpdate()
    {}

    public GameStatusUpdate(Player[] players, Command command)
    {
        this.Players = players;
        this.Update = command;
    }

    [XmlArray("Players")]
    public Player[] Players { get; set; }

    [XmlElement("Command")]
    public Command Update { get; set; }
}

(缺少的类型都是枚举)

这将在序列化时生成以下XML:

<?xml version="1.0" encoding="utf-16"?>
<StatusUpdate>
  <Players>
    <Player Color="Cyan" X="67" Y="32" />
  </Players>
  <Command>StartGame</Command>
</StatusUpdate>

但是,反序列化程序会引发异常:

There is an error in XML document (2, 2).
<StatusUpdate xmlns=''> was not expected.
客户:

    public static object DeserializeXml(string xmlData, Type type)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(type);


        StringReader reader = new StringReader(xmlData);
        object obj = xmlSerializer.Deserialize(reader);

        return obj;
    }
使用调用反序列化

StatusUpdate update = (StatusUpdate) Util.DeserializeXml(xmlData, typeof (StatusUpdate));

在使用
XmlSerializer
时,这实际上是非常罕见的。根元素应始终如下所示:

<MyClass 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

因此,如果您遇到了一些问题,那么在客户端将字节数组转换为XML字符串的过程中很可能会出错。这是您唯一还没有发布的代码。

经过大量测试,我终于发现了一个错误。这不是编码问题,也不是其他代码中的问题,也不是缺少的名称空间

缺少的部分是反序列化时数组中对象类型的注释

因此,我不得不将我的
StatusUpdate
类更改为

[XmlRoot("StatusUpdate")]
public class StatusUpdate
{
    public StatusUpdate()
    {

    }

    [XmlArray("Players"), XmlArrayItem(ElementName = "Player", Type = typeof(PlayerInfo))]
    public PlayerInfo[] Players { get; set; }

    [XmlElement("Command")]
    public ServerCommand Update { get; set; }
}
序列化开始完美地工作


我希望这能帮助其他人。

以下是我解决问题的方法:

[System.Xml.Serialization.XmlRootAttribute("nodeName", Namespace = "http://somenamespace", IsNullable = false)]

我下定决心了

            XmlSerializer serializer = new XmlSerializer(typeof(CustomerPhoto), "http://example.com/webservices/");
            CustomerPhoto returnObject = (CustomerPhoto)serializer.Deserialize(xmlStream);

您缺少的第一件事是没有向我们显示用于反序列化的代码。这仍然是不完整的。当字符串
xmlData
在另一端序列化为字节时,它从何而来?如果这实际上是一个编码问题,我不会感到惊讶。为什么你的评论提到了“utf-18”,而实际上却没有这样的东西?在我的例子中,这是因为
XmlSerializer
的声明错误。所以也检查一下。
<MyClass 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
MyClass m = new MyClass() { X = 4, Y = 8 };
byte[] data = SerializeObject(m);
string xml = Encoding.Unicode.GetString(data);
Console.WriteLine(xml);
m = (MyClass)DeserializeXml(xml, typeof(MyClass));
[XmlRoot("StatusUpdate")]
public class StatusUpdate
{
    public StatusUpdate()
    {

    }

    [XmlArray("Players"), XmlArrayItem(ElementName = "Player", Type = typeof(PlayerInfo))]
    public PlayerInfo[] Players { get; set; }

    [XmlElement("Command")]
    public ServerCommand Update { get; set; }
}
[System.Xml.Serialization.XmlRootAttribute("nodeName", Namespace = "http://somenamespace", IsNullable = false)]
            XmlSerializer serializer = new XmlSerializer(typeof(CustomerPhoto), "http://example.com/webservices/");
            CustomerPhoto returnObject = (CustomerPhoto)serializer.Deserialize(xmlStream);