C# 如何从XML字符串反序列化对象?
我正在尝试使用xmlSerializer.deserialize()从XML字符串反序列化对象,但返回的对象始终为空(不是null,但所有属性都为null或0)。我不知道我做错了什么,但我没有得到任何错误或例外C# 如何从XML字符串反序列化对象?,c#,.net,xml,xml-serialization,xml-deserialization,C#,.net,Xml,Xml Serialization,Xml Deserialization,我正在尝试使用xmlSerializer.deserialize()从XML字符串反序列化对象,但返回的对象始终为空(不是null,但所有属性都为null或0)。我不知道我做错了什么,但我没有得到任何错误或例外 string xml = "***my xml is here***"; XmlSerializer ser = new XmlSerializer(typeof(Order)); StringReader stringReader = new StringReader(xml); X
string xml = "***my xml is here***";
XmlSerializer ser = new XmlSerializer(typeof(Order));
StringReader stringReader = new StringReader(xml);
XmlTextReader xmlReader = new XmlTextReader(stringReader);
Order order = (Order)ser.Deserialize(xmlReader);
xmlReader.Close();
stringReader.Close();
Order.cs的源是使用XSD.exe工具从XSD生成的
order.cs的来源:
示例order XML:返回一个对象的事实告诉我该对象是公共的,并且有一个公共的无参数构造函数(否则会引发异常)。因此,它很可能会失败:
- 反序列化成员必须是具有public
和publicget
的公共属性,或者是公共(非只读)字段set
- 默认情况下,成员名称必须与xml元素名称完全匹配,与父元素位于同一xml命名空间中;可以通过属性(更改名称、使用属性、名称空间等)获得更精细的控制
- 反序列化成员必须是具有public
和publicget
的公共属性,或者是公共(非只读)字段set
- 默认情况下,成员名称必须与xml元素名称完全匹配,与父元素位于同一xml命名空间中;可以通过属性(更改名称、使用属性、名称空间等)获得更精细的控制
http://tempuri.org/OrderSchema.xsd
但是XSD(order.cs)生成的代码定义了名称空间中的所有元素http://x-rm.com/wrightcottrell/cataloguecd/
为了使序列化正常工作,您需要这些名称空间进行匹配。您的示例XML文件(example order.XML)使用名称空间http://tempuri.org/OrderSchema.xsd
但是XSD生成的代码(order.cs)定义命名空间中的所有元素http://x-rm.com/wrightcottrell/cataloguecd/
要使序列化正常工作,您需要这些名称空间进行匹配。我本来打算粘贴order.cs的XML和源代码,但我看不到如何在此处附加文件。您可以发布order类吗?请将代码放入您的问题中。但是你不应该包括整个源代码,只是一个有同样问题的最小代码。不要附加文件,复制/粘贴相关部分到问题中。我认为这是正确的。XML看起来像什么?属性是否有getter/setter?你是如何连续化订单的?您是否在属性上放置可序列化标记?我本来打算粘贴Order.cs的XML和源代码,但我看不到如何在此处附加文件。您可以发布您的Order类吗?请将代码放入您的问题中。但是你不应该包括整个源代码,只是一个有同样问题的最小代码。不要附加文件,复制/粘贴相关部分到问题中。我认为这是正确的。XML看起来像什么?属性是否有getter/setter?你是如何连续化订单的?您是否在属性上放置可序列化标记?我没有用于排序的构造函数-我假定值是由反序列化函数而不是构造函数填充的?@Nick yes;如果不声明一个,编译器将假定一个公共的无参数构造函数。如果没有公共的无参数构造函数,它将无法工作。我没有Order的构造函数-我假定值是由反序列化函数而不是构造函数填充的?@Nick yes,你有;如果不声明一个,编译器将假定一个公共的无参数构造函数。如果没有公共的无参数构造函数,它将无法工作。