2014-01-24 3 views
0

웹 서비스에 요청을 보내야합니다. 이 요청은 "세션"객체를 매개 변수로 요청합니다.C#, XMl 파일을 비 직렬화 할 수 없습니다.

[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 파일입니다. 나는이 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> 

은, 난 단지 ID를 얻을 항목은 항상 곁에 null입니다. BTW, 세션 클래스는 웹 서비스에서, 나는 그것을 변경할 수 없습니다.

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; 

    } 

UPDATE :

여기에 XML 스키마입니다.

<?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> 

답변

1

세션 클래스에는 아무런 문제가 없습니다. 그러나, 거의 XML 디시리얼라이저는 같은 XML 네임 스페이스에있는 당신의 session의 하위 요소를 고려한다는 것을 의미

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0")] 

로 표시됩니다. 한마디로

,과 같이 XML 파일에 추한 네임 스페이스 정의를 추가 :

<properties xmlns="http://www.xmlns.cfins.com/cfins/services/publishPolicyData/1.0" ... 

은 트릭을 할 것입니다 : 당신이 필요한 모든 sessionProperties 및 sessionData를 얻을 수 있습니다.

0

XmlElement은 수집 또는 배열 속성에 사용하면 안됩니다. 대신 XmlArrayXmlArrayItem을 사용해야합니다. 위와 같이 코드가 생성되는 이유를 알 수 없습니다. 생성 된 후에 수정 했습니까? 스키마를 공유하면 codegen으로 문제를 식별 할 수 있습니다.

[XmlArray] 
[XmlArrayItem("data", typeof(sessionData))] 
[XmlArrayItem("properties", typeof(sessionProperties))] 
public object[] Items { 
    get { 
     return this.itemsField; 
    } 
    set { 
     this.itemsField = value; 
    } 
} 
+0

내 게시물이 업데이트되어 거기에 스키마가 추가되었습니다. 당신의 도움을 주셔서 감사합니다. – qinking126

+0

그리고 codegen에 xsd.exe를 사용하고 있습니까? –

+0

다른 개발자가 xml을 Visual Studio에로드합니다. 상단 메뉴에서 xml을 선택한 다음 스키마 생성을 선택하십시오. – qinking126

0

Xml 직렬화를 사용하려면 모든 속성에 공개 getter 및 setter가 있어야하며 그렇지 않은 경우 반사기는 직렬화 또는 직렬화를 거부합니다.

관련 문제