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