gpt4 book ai didi

从 Web 服务引用的 C# 类未正确反序列化

转载 作者:数据小太阳 更新时间:2023-10-29 02:11:44 26 4
gpt4 key购买 nike

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

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

这是相关类(class)的一个片段:

[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()> _
Public Class RetailInformation_StoreInformation
...
End Class

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

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

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

在 StoreInfoDisplayApp 项目中,我们添加了对名为 RetailInfoService 的网络服务的网络引用。

我们发现我们无法像这样从 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 服务引用的 C# 类未正确反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1439995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com