C#XML列表反序列化;没有引发异常,但没有反序列化对象
本文关键字:反序列化 对象 异常 列表 C#XML | 更新日期: 2023-09-27 18:28:37
我正在尝试将XML反序列化为C#对象。当我运行代码时,不会抛出异常,但我得到的对象是空的。我有点没有调试的想法。
我的序列化域类:
[SerializableAttribute()]
[XmlTypeAttribute(TypeName = "group_lookup_result")]
[XmlRootAttribute("group_lookup_result")]
public class GroupLookupResult
{
private string _groupId;
private string _groupName;
public GroupLookupResult()
{
_groupId = "";
_groupName = "";
}
[XmlElement("group_id")]
public string GroupID
{
get { return _groupId; }
set { _groupId = value; }
}
[XmlElement("group_name")]
public string GroupName
{
get { return _groupName; }
set { _groupName = value; }
}
}
[SerializableAttribute()]
[XmlRootAttribute(ElementName = "group_lookup_result_list", IsNullable = false, Namespace = "http://ws.byu.edu/namespaces/gro/v1")]
[XmlTypeAttribute(TypeName = "group_lookup_result_list", Namespace = "http://ws.byu.edu/namespaces/gro/v1")]
public class GroupLookupResultList
{
private List<GroupLookupResult> _searchResults;
public GroupLookupResultList() { }
[XmlArrayItem(IsNullable = false)]
public List<GroupLookupResult> group_lookup_results
{
get { return _searchResults; }
set { _searchResults = value; }
}
}
我的反序列化代码:
class Program
{
static void Main(string[] args)
{
string incomingXml = "<?xml version='"1.0'" encoding='"UTF-8'" standalone='"yes'" ?>" +
"<ns2:group_lookup_result_list xmlns:ns2='"http://ws.byu.edu/namespaces/gro/v1'">" +
"<group_lookup_results>" +
"<group_lookup_result>" +
"<group_id>bradtest</group_id>" +
"<group_name>Brad's Test Group</group_name>" +
"<effective_date>2011-05-04T00:00:00-06:00</effective_date>" +
"<expiration_date>2014-01-10T23:59:59-07:00</expiration_date>" +
"</group_lookup_result>" +
"<group_lookup_result>" +
"<group_id>brjtest</group_id>" +
"<group_name>Bernt's Test Group</group_name>" +
"<effective_date>2011-05-05T00:00:00-06:00</effective_date>" +
"<expiration_date>2012-05-05T23:59:59-06:00</expiration_date>" +
"</group_lookup_result>" +
"</group_lookup_results>" +
"</ns2:group_lookup_result_list>";
XmlSerializer searchResultSerializer = new XmlSerializer(typeof(GroupLookupResultList));
System.IO.StringReader reader = new System.IO.StringReader(incomingXml);
GroupLookupResultList resultList = (GroupLookupResultList)searchResultSerializer.Deserialize(reader);
System.Diagnostics.Debug.WriteLine("Deserialized " + resultList.group_lookup_results.Count + " results");
}
}
我意识到我的域对象不会反序列化<effective_date>
或<expiration_date>
,但我以前忽略过XML元素,没有问题。我还尝试过反序列化单个group_lookup_result
,它是成功的;似乎只是group_lookup_result_list
对象(或者可能是它的List
元素)引起了问题。我的猜测是我没有正确处理名称空间。
所以,我的问题是:
我的序列化配置有什么问题
或
如何调试
我已经成功地复制了这一点(很好的例子btw)并使对象反序列化。我在元素声明中添加了Form=System.Xml.Schema.XmlSchemaForm.Unquelized,这就成功了。我还稍微调整了group_lookup_results属性,以向反序列化程序通知各个项元素名称(使用XmlArrayItemAttribute)。
下面的代码。
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
string incomingXml = "<?xml version='"1.0'" encoding='"UTF-8'" standalone='"yes'" ?>" +
"<ns2:group_lookup_result_list xmlns:ns2='"http://ws.byu.edu/namespaces/gro/v1'">" +
"<group_lookup_results>" +
"<group_lookup_result>" +
"<group_id>bradtest</group_id>" +
"<group_name>Brad's Test Group</group_name>" +
"<effective_date>2011-05-04T00:00:00-06:00</effective_date>" +
"<expiration_date>2014-01-10T23:59:59-07:00</expiration_date>" +
"</group_lookup_result>" +
"<group_lookup_result>" +
"<group_id>brjtest</group_id>" +
"<group_name>Bernt's Test Group</group_name>" +
"<effective_date>2011-05-05T00:00:00-06:00</effective_date>" +
"<expiration_date>2012-05-05T23:59:59-06:00</expiration_date>" +
"</group_lookup_result>" +
"</group_lookup_results>" +
"</ns2:group_lookup_result_list>";
XmlSerializer searchResultSerializer = new XmlSerializer(typeof(GroupLookupResultList));
System.IO.StringReader reader = new System.IO.StringReader(incomingXml);
GroupLookupResultList resultList = (GroupLookupResultList)searchResultSerializer.Deserialize(reader);
System.Diagnostics.Debug.WriteLine("Deserialized " + resultList.group_lookup_results.Count + " results");
}
}
[SerializableAttribute()]
[XmlTypeAttribute(TypeName = "group_lookup_result")]
[XmlRootAttribute("group_lookup_result")]
public class GroupLookupResult
{
private string _groupId;
private string _groupName;
public GroupLookupResult()
{
_groupId = "";
_groupName = "";
}
[XmlElement("group_id", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string GroupID
{
get { return _groupId; }
set { _groupId = value; }
}
[XmlElement("group_name", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string GroupName
{
get { return _groupName; }
set { _groupName = value; }
}
}
[SerializableAttribute()]
[XmlRootAttribute(ElementName = "group_lookup_result_list", IsNullable = false, Namespace = "http://ws.byu.edu/namespaces/gro/v1")]
[XmlTypeAttribute(TypeName = "group_lookup_result_list", Namespace = "http://ws.byu.edu/namespaces/gro/v1")]
public class GroupLookupResultList
{
private List<GroupLookupResult> _searchResults;
public GroupLookupResultList() { }
[System.Xml.Serialization.XmlArrayAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("group_lookup_result", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)]
public List<GroupLookupResult> group_lookup_results
{
get { return _searchResults; }
set { _searchResults = value; }
}
}
我认为您需要指定它也是XmlArray:
[XmlArray("group_lookup_results")]
[XmlArrayItem(IsNullable = false)]
public List<GroupLookupResult> group_lookup_results;
这里有一个更具体的XmlArray
和XmlArrayItem
的名称空间规范示例