【问题标题】:C# class referenced from web service not deserializing properly从 Web 服务引用的 C# 类未正确反序列化
【发布时间】:2009-09-17 16:43:51
【问题描述】:

我有一个 Web 服务将一个类(类来自 Web 服务)序列化为一个 MSMQ,然后一个 Windows 服务正在检查队列并反序列化。 Windows 服务有一个 Web 引用来获取该类。

如果我在 Web 服务内部反序列化,一切都会正常。但是,当我从 Windows 服务反序列化时,一切正常,除了两个作为 null 的字符串数组,所以我相信某些内容没有通过 Web 引用正确传输。

这是来自相关课程的 sn-p:

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

是否有一些特殊的方法我必须引用该类或在该类中设置字符串 [] 才能正确引用它?

这是我序列化到文件时得到的输出:

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

请记住,除了 BodyParameters 和 SubjectParameters 之外的所有内容都可以在 Windows 服务中正常运行。 Web 服务,一切正常。

【问题讨论】:

  • 建议:删除 [Serializable] 属性,因为 XML 序列化不使用它。然后,序列化成一个文件,然后发布文件,这样我们就可以看到 XML 的格式了。
  • 另一个建议:DRY——在你的项目中使用相同的类库进行序列化/反序列化。

标签: c# xml web-services serialization xml-serialization


【解决方案1】:

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

我们的设置是,我们有一台服务器专门用于提供 Web 服务以在所有其他组件之间传递数据。

类是在 Web 服务项目中定义的。示例:

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

当我们有一个客户端类尝试反序列化序列化数据时,我们无法做到。我们尝试将包含 RetailInformation_StoreInformation 类的 dll 复制到客户端应用程序中,但它不会反序列化。

我们最终发现的是这个..

假设我们有一个名为 StoreInfoDisplayApp 的客户端应用程序

在 StoreInfoDisplayApp 项目中,我们添加了对名为 RetailInfoService 的 Web 服务的 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 服务提供的类型相同。然后它就像一个桃子一样工作!

【讨论】:

  • 好吧,我只是在引用 Web 服务,而不是 dll。就像我说的,其他字段被反序列化,而不是 string[] 的
【解决方案2】:

您需要像这样将 [XmlArray] 放在 SubjectParameters 属性上


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多