C#反序列化问题

时间:2010-11-12 15:08:27

标签: c# xml serialization xml-serialization

我有以下课程:

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

我使用这种类型化的方法来反序列化(通过调用Deserialize&lt; SSN_ReceiptType&gt;(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:&lt; SSN_Receipt xmlns ='urn:eu.emsa.ssn'&gt;没想到。

到底是什么? :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>

3 个答案:

答案 0 :(得分: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 {}

这完全解决了我的问题。但我仍然不明白为什么这首先打破了。

如果有人能够提出一个很好的可测试答案,为什么它会破裂,我会做出正确答案。

谢谢你们的时间!这在某种程度上是一种教育经验:)

答案 1 :(得分: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> 

答案 2 :(得分:0)

您应该生成SSN_Receipt个类。将该类传递给反序列化方法时需要使用该类。

IE:

Deserialize<SSN_Receipt>(xmlGoesHere);

而不是SSN_ReceiptType