2009-09-17 65 views
4

我有一个Web服务将序列化一个类(类是从Web服务)到MSMQ,然后一个Windows服务正在检查队列和反序列化。 Windows服务有一个Web引用来获得该类。从Web服务引用的C#类不正确反序列化

如果我反序列化Web服务内部,一切都很好。然而,当我从Windows服务反序列化时,除了两个字符串数组以外,所有工作都是空的,所以我相信某些东西不能通过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; 
    } 
} 
} 

的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; 
     } 
    } 

有我有一些特殊的方法引用类或在类中设置字符串[]以便它被正确地引用?

这里的输出我得到的,如果我序列化到一个文件:

<?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="[email protected]" 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> 

请记住,除了BodyParameters和SubjectParameters一切都在窗口服务出精品。 Web服务,一切正常。

+0

建议:删除'[Serializable接口]'属性,因为它不使用XML序列化。然后,序列化到一个文件,并发布文件,以便我们可以看到XML的格式。 – 2009-09-17 17:00:52

+0

另一个建议:干 - 在项目中使用相同的类库进行序列化/反序列化。 – jro 2009-09-18 01:29:58

回答

1

我在开发多层应用程序时遇到了这个年头。我希望你的情况和我的情况一样,所以这会有所帮助。

我们的设置是我们有一台服务器专门用于提供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服务提供的类型相同。然后它像桃子一样工作!

+0

那么,我只是参考了Web服务,而不是一个DLL。就像我说的,其他字段是反序列化的,而不是字符串[]的 – Luke 2009-09-17 20:33:46

1

你需要把[XmlArray]在SubjectParameters财产这样


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

我也试过,也没有运气。 – Luke 2009-09-21 19:31:08

相关问题