[英]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.