2010-11-12 121 views
4

我有下面的類:C#反序列化問題

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:eu.emsa.ssn")] 
public partial class SSN_ReceiptType { 

    private Header1Type headerField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Order=0)] 
    public Header1Type Header { 
     get { 
      return this.headerField; 
     } 
     set { 
      this.headerField = value; 
     } 
    } 
} 

而下面的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <SSN_Receipt xmlns="urn:eu.emsa.ssn"> 
     <Header StatusMessage="SomethingSomething" StatusCode="Blabla" SSNRefId="N/A" MSRefId="2674762" Version="2.0" To="NCANOHAU1" SentAt="2010-11-12T14:48:44Z" From="SSN"/> 
    </SSN_Receipt> 

而且我用這個類型化的方法來反序列化(通過調用反序列化<SSN_ReceiptType>(xmlGoesHere)) :

/// <summary> 
    /// Deserialize xml string to object of type T 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="xml"></param> 
    /// <returns></returns> 
    public static T Deserialize<T>(string xml) 
    { 
     try 
     { 

      // Create serializer 
      var xs = new XmlSerializer(typeof(T)); 

      // Deserialize 
      T t = (T)xs.Deserialize(new StringReader(xml)); 

      return t; 
     } 
     catch (Exception e) 
     { 
      log.Error(string.Format("Unable to deserialize XML: {0}", xml), e); 

      return default(T); 
     } 
    } 

現在,這裏是踢球者。這用於工作。但最近我們收到了XSD的新版本用來生成類,並生成新的代碼後(這是該類不變,上面看到的)嘗試反序列化時,我收到以下異常:

System.SystemException: 「有XML文檔中的誤差(1,57)」

進而:

System.InnerException:< SSN_Receipt的xmlns = '甕:eu.emsa.ssn'預計不會出現>。

到底是什麼? :S我試着添加一個指定「SSN_Receipt」的XmlRootAttribute,這並沒有幫助一點。任何人都知道發生了什麼事?

更新:從XSD相關章節:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:ssn="urn:eu.emsa.ssn" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified" 
    targetNamespace="urn:eu.emsa.ssn"> 
[...] 
<xsd:element name="SSN_Receipt" type="ssn:SSN_ReceiptType"/> 
[...] 
<xsd:complexType name="SSN_ReceiptType"> 
    <xsd:annotation> 
     <xsd:documentation xml:lang="en"/> 
    </xsd:annotation> 
    <xsd:sequence> 
     <xsd:element name="Header" type="ssn:Header1Type"/> 
    </xsd:sequence> 
</xsd:complexType> 
+2

請注意你的語言。這是一個社區論壇。 – 2010-11-12 15:09:15

+0

刪除的語言... – 2010-11-12 15:11:53

+0

xsd文件之間有什麼區別? – Kell 2010-11-12 15:14:40

回答

3

爲其他貧困的靈魂將來參考,這裏是我想出了一個解決方案。

正如我的問題所述,我的類是從XSD生成的。我測試了我們課程的以前版本,並且它們仍然工作得很好。另外,使用相同類的SOAP服務也適用。檢查跟蹤日誌,我看不到任何特別揭示。

但我找到了一個具體的解決方案。我添加了以下屬性上我的課:

[System.Xml.Serialization.XmlRoot(Namespace = "urn:eu.emsa.ssn", 
            ElementName = "SSN_Receipt")] 

現在,我不想我的垃圾生成的類與自定義代碼,所以我加了一個局部類:

[System.Xml.Serialization.XmlRoot(Namespace = "urn:eu.emsa.ssn", 
            ElementName = "SSN_Receipt")] 
public partial class SSN_ReceiptType {} 

這解決了我的問題完全。但我仍然不明白爲什麼這首先打破了。

如果任何人都能拿出一個很好的可測試答案來解釋它爲什麼會壞掉,我會做出正確的答案。

謝謝你的時間傢伙!這一直是一種教育體驗,在一定程度上:)

+0

哇,奇怪:我期望xsd.exe在你的類上生成這個屬性。那麼,如果我遇到過這個問題,我必須記住這個。 – Kell 2010-11-16 09:43:18

0

我敢肯定你的XML應該讀

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ssn:SSN_Receipt xmlns="urn:eu.emsa.ssn"> 
    <ssn:Header StatusMessage="SomethingSomething" StatusCode="Blabla" SSNRefId="N/A" MSRefId="2674762" Version="2.0" To="NCANOHAU1" SentAt="2010-11-12T14:48:44Z" From="SSN"/> 
</ssn:SSN_Receipt> 
+0

該元素應以前綴ssn: – Kell 2010-11-12 15:54:13

+0

爲前提,謝謝,請立即嘗試一下 – andrerav 2010-11-12 15:55:21

+0

修改過的XML現在產生如下結果:'ssn'是一個未聲明的名稱空間。第1行,第57位。 – andrerav 2010-11-12 15:56:52

0

你應該已經產生了SSN_Receipt類。將它傳遞給反序列化方法時,您需要使用該類。

IE:

Deserialize<SSN_Receipt>(xmlGoesHere); 

,而不是SSN_ReceiptType

+0

我不太確定 - 如果你看看XSD,生成的代碼是有道理的。元素名稱是SSN_Receipt,但類型名稱是SSN_ReceiptType。 – andrerav 2010-11-15 09:30:44