我需要向Web服务发送请求。此请求要求"会话"对象作为参数。
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.18060")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0")]
public partial class session {
private object[] itemsField;
private string idField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("data", typeof(sessionData))]
[System.Xml.Serialization.XmlElementAttribute("properties", typeof(sessionProperties))]
public object[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string id {
get {
return this.idField;
}
set {
this.idField = value;
}
}
}
这是我的xml文件。
<session id="6055">
<properties dateModified="2014-01-08" engineVersion="2.0" cultureCode="en-US" cultureName="United States [english]">
<userName>admin</userName>
</properties>
<data id="d2311A049FDC64CD9AE9EF3DE5874CB2D">
.....
</data>
</session>
当我反序列化这个xml文件时,我只得到id,items总是为null。顺便说一句,会话类来自Web服务,我无法改变它。
public static session GetSession()
{
var s = new session();
var data = new sessionData();
var sessionXml = @"C:\Projects\CFWinSvc - Copy\XmlDeSerialize\session.xml";
using (TextReader reader = new System.IO.StreamReader(sessionXml))
{
var serializer = new XmlSerializer(typeof(session));
s = (session)serializer.Deserialize(reader);
}
return s;
}
public static session GetSession()
{
var s = new session();
var data = new sessionData();
var sessionXml = @"C:\Projects\CFWinSvc - Copy\XmlDeSerialize\session.xml";
using (TextReader reader = new System.IO.StreamReader(sessionXml))
{
var serializer = new XmlSerializer(typeof(session));
s = (session)serializer.Deserialize(reader);
}
return s;
}
更新
这里是XML Schema。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://www.cfins.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="session">
<xs:complexType>
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element name="properties">
<xs:complexType>
<xs:sequence>
<xs:element name="userName" type="xs:string"/>
</xs:sequence>
<xs:attribute name="dateModified" use="optional"/>
<xs:attribute name="engineVersion" type="xs:string" use="optional"/>
<xs:attribute name="cultureCode" type="xs:string" use="optional"/>
<xs:attribute name="cultureName" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="data">
<xs:complexType>
<xs:all>
<xs:element name="AlwaysAddIDs" type="xs:boolean" minOccurs="0"/>
<xs:element name="ProRatingOn" type="xs:boolean" minOccurs="0"/>
<xs:element name="carrier" minOccurs="0">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="userinterface" minOccurs="0">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="id" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:sequence>
<xs:attribute name="id" use="optional"/>
</xs:complexType>
</xs:element>
</xs:schema>
答案 0 :(得分:1)
您的会话课没有任何问题。 但是,它标记为
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0")]
这几乎意味着xml反序列化器只会考虑session
中位于同一xml名称空间中的子元素。
简而言之,将丑陋的命名空间定义添加到xml文件中,如下所示:
<properties xmlns="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0" ...
将解决这个问题:你将获得所需的所有sessionProperties和sessionData。
答案 1 :(得分:0)
XmlElement
不应用于集合或数组属性。应该使用XmlArray
和XmlArrayItem
代替。我不知道为什么会像上面显示的那样生成代码。它是在生成后修改的吗?如果您共享架构,我们可以通过codegen确定问题。
[XmlArray]
[XmlArrayItem("data", typeof(sessionData))]
[XmlArrayItem("properties", typeof(sessionProperties))]
public object[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
答案 2 :(得分:0)
要使用Xml序列化,所有属性都需要有一个公共getter和setter,否则就是反射器,同时拒绝序列化或反序列化你的对象。