我有一个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;
}
}
有没有一些特殊的方法我必须引用类或在类中设置字符串[],以便正确引用它?
<?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服务,一切正常.
解决方法:
我在几年前遇到了开发多层应用程序的问题.我希望你的情况和我的情况一样,所以这会有所帮助.
我们的设置是我们有一台服务器专门用于提供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服务提供的类型相同.然后它像桃子一样工作!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。