【发布时间】:2016-06-23 15:31:36
【问题描述】:
我正在使用 System.Xml.Serialization.XmlSerializer 类。我需要在 C# 中反序列化以下 XML:
<message from="abc" to="xyz" xml:lang="en" id="Vx4Ix-14" type="chat">
<received xmlns="urn:xmpp:receipts" id="9beea4d7-aa1e-4f3c-929c-712b56164b63"/>
</message>
下面是我的类来反序列化它:
[XmlRoot(ElementName = "message")]
public class Message
{
[XmlAttribute(AttributeName = "type")]
public string Type { get; set; }
[XmlAttribute(AttributeName = "from")]
public string From { get; set; }
[XmlAttribute(AttributeName = "to")]
public string To { get; set; }
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "xml:lang")]
public string Language { get; set; }
[XmlElement(ElementName = "received", Namespace = "urn:xmpp:receipts")]
public Received Received { get; set; }
}
public class Received
{
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
}
“received”xml 元素只有属性,我希望反序列化该元素以获取该元素的“id”值。 但是当我使用上面的类进行 Deserialize 时,我得到了除“received”xml 元素的“id”属性值之外的所有值。我将 Received 属性的值为 null。
请让我知道我的班级出了什么问题?
这是我的反序列化方法:
public static T Deserialize<T>(string xml)
{
T deserializedObject = default(T);
try
{
var serializer = new XmlSerializer(typeof(T));
using (var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
deserializedObject = (T)serializer.Deserialize(memoryStream);
}
return deserializedObject;
}
catch (Exception)
{
return deserializedObject;
}
}
【问题讨论】:
-
我在一个简单的 VS2015 控制台应用程序(不是 windows phone)中测试了你的类,它运行良好。你的反序列化代码是什么样子的?
-
我已经用我使用的反序列化方法更新了这个问题。你是对的,我的方法有问题。控制台应用程序运行良好。
-
我刚刚尝试了您的“反序列化”方法,并且在控制台应用程序中也可以正常工作。你能展示你用来调用“反序列化”的代码吗?
-
XMLSerializer.Deserialize
(strXML)。我就是这样用的。 -
我弄错了。在使用 [XmlElement(ElementName = "received", Namespace = "urn:xmpp:receipts")] 在 "Message" 类中定义 "Received" 属性时,我在 "xmpp" ("urn: xmpp:receipts)。由于额外的空间序列化程序无法正确反序列化它。但是在发布问题时,我以某种方式删除了该空间。非常感谢您的回复。
标签: c# xml windows windows-phone-8