簡體   English   中英

從Web服務引用的C#類未正確反序列化

[英]C# class referenced from web service not deserializing properly

我有一個Web服務,它將一個類(該類來自Web服務)序列化為MSMQ ,然后Windows服務正在檢查隊列並反序列化。 Windows服務具有用於獲取該類的Web參考。

如果我在Web服務中反序列化,一切都會很好。 但是,當我從Windows服務反序列化時,除了兩個字符串數組都為null以外,其他所有東西都可以正常工作,因此我認為某些內容無法通過Web參考正確傳輸。

以下是相關課程的摘錄:

[Serializable, XmlInclude(typeof(EmailType))]
public partial class Email
{
[System.Xml.Serialization.XmlElement("BodyParameters")]
public string[] BodyParameters
{
    get
    {
        return this.bodyParameters;
    }
    set
    {
        this.bodyParameters = value;
    }
}

[System.Xml.Serialization.XmlElement("SubjectParameters")]
public string[] SubjectParameters
{
    get
    {
        return this.subjectParameters;
    }
    set
    {
        this.subjectParameters = value;
    }
}
}

我在Windows服務中獲得的Reference.cs文件如下所示:

/// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("BodyParameters")]
    public string[] BodyParameters {
        get {
            return this.bodyParametersField;
        }
        set {
            this.bodyParametersField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("SubjectParameters")]
    public string[] SubjectParameters {
        get {
            return this.subjectParametersField;
        }
        set {
            this.subjectParametersField = value;
        }
    }

我必須參考某種方法或在類中設置string []以使其正確被參考嗎?

這是我序列化到文件后得到的輸出:

<?xml version="1.0" encoding="utf-8"?>
<Email xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema" MessageType="None" PackageID="0"     To="asdf@asdf.com" Subject="testing..." Body="this is a test" IsHTML="false">
  <BodyParameters>one two</BodyParameters>
  <BodyParameters>three four</BodyParameters>
  <BodyParameters>test test</BodyParameters>
  <SubjectParameters>foo</SubjectParameters>
</Email>

請記住,在Windows服務中,除BodyParameters和SubjectParameters之外的所有內容都可以正常使用。 Web服務,一切正常。

幾年前,我在開發多層應用程序時遇到了問題。 希望您的情況與我的情況相同,所以這會有所幫助。

我們的設置是,我們有一台服務器專門用於提供Web服務,以便在所有其他組件之間傳遞數據。

在Web服務項目中定義了類。 例:

<Serializable()> _
Public Class RetailInformation_StoreInformation
... 
End Class

當我們有一個客戶端類嘗試對序列化的數據進行反序列化時,我們無法做到。 我們嘗試將包含RetailInformation_StoreInformation類的dll復制到客戶端應用程序中,但是不會反序列化。

我們最終發現的是這個。

假設我們有一個名為StoreInfoDisplayApp的客戶端應用程序

在StoreInfoDisplayApp項目中,我們已將Web參考添加到名為RetailInfoService的Web服務。

我們發現無法像這樣從dll反序列化RetailInformation_StoreInformation:

Private Function DeSerializeStoreInfo(ByVal path As String) As RetailInformation_StoreInformation
        Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(RetailInformation_StoreInformation))
        Dim reader As System.IO.Stream = File.OpenRead(path)
        Dim returnvalue As RetailInformation_StoreInformation = CType(ser.Deserialize(reader), RetailInformation_StoreInformation)
        reader.Close()
        Return returnvalue
    End Function

因為編譯器(或運行時-內存模糊)將其視為StoreInfoDisplayApp.RetailInformation_StoreInformation

相反,我們必須更改以下所有實例

RetailInformation_StoreInformation

RetailInfoService.RetailInformation_StoreInformation

指定我們要反序列化的類型與Web服務提供的類型相同。 然后它像桃子一樣起作用!

您需要像這樣將[XmlArray]放在SubjectParameters屬性上


    [System.Xml.Serialization.XmlArrayAttribute(ElementName="SubjectParameters")]
    public string[] SubjectParameters {
        get {
            return this.subjectParametersField;
        }
        set {
            this.subjectParametersField = value;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM