我一直在想办法解决这个问题,任何想法都是非常受欢迎的!
我在vb.net中有一个使用MSMQ的客户机/侦听器应用程序,当我不使用sgen.exe在编译时生成序列化时,它可以100%正常工作。
当使用sgen时,它在侦听器部分失败。
qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})
m = qOrders.EndReceive(e.AsyncResult)m.Body有错误"Cannot deserialize the message passed as an argument. Cannot recognize the serialization format.",其余的属性也有没有接收到值的错误。
该程序集具有强名称,并且App.XmlSerializers.dll也经过正确签名。我知道使用了dll,因为我不能在程序运行时删除它。
InfoMessage类是一个简单的公共类,包含3个公共字符串成员。使用Reflector检查动态链接库,我确实看到sgen生成了一个InfoMessageSerializer类。
问题不在客户端,因为我删除了dll并运行了侦听器,它照常工作。
那么,这里会有什么问题呢?
谢谢,
约翰
编辑:链接到监听程序源:http://pastebin.com/TqWfLVJ0
发布于 2012-06-27 06:41:37
有一个sgen输出的design limitation。这个限制就是never removed
这些生成的程序集不能在Web服务的服务器端使用。此工具仅适用于Web服务客户端和手动序列化场景。
基本上,您不需要运行sgen来提高web服务的服务器端速度,因为XmlSerializer启动时间不是影响其性能的关键因素(与某些类型的客户端相比)。
当然,只要您不将任何XmlAttributeOverrides传递给XmlSerializer的构造函数,就可以在非web服务场景中的服务器端使用sgen。
在MSMQ中,可以选择二进制和XML序列化,您的代码在这里选择后者:
qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})那么让我们来看看MessageQueue是如何创建XmlSerializer的。以下是取自System.Messaging.dll,.NET 4.0的XmlMessageFormatter方法。它的.NET 2.0版本与之类似。
private void CreateTargetSerializerTable()
{
if (!this.typeNamesAdded)
{
for (int index = 0; index < this.targetTypeNames.Length; ++index)
{
Type type = Type.GetType(this.targetTypeNames[index], true);
if (type != (Type) null)
this.targetSerializerTable[(object) type]
= (object)new XmlSerializer(type);
}
this.typeNamesAdded = true;
}
if (!this.typesAdded)
{
for (int index = 0; index < this.targetTypes.Length; ++index)
this.targetSerializerTable[(object) this.targetTypes[index]]
= (object)new XmlSerializer(this.targetTypes[index]);
this.typesAdded = true;
}
if (this.targetSerializerTable.Count == 0)
throw new InvalidOperationException(Res.GetString("TypeListMissing"));
}正如您所看到的,MSMQ不提供XmlAttributeOverrides,这与框架中的web服务服务器端代码不同。尽管如此,还是有其他人使用have trouble结合XmlMessageFormatter和sgen。
我的猜测是sgen仍然可以与MSMQ一起工作,因为MSMQ没有使用XmlAttributeOverrides,但你必须确保你没有使用proxytypes命令行选项,并且你仍然在微软曾经测试过的东西之外移动。
我建议看看这些可能性:
sgen与MSMQ一起使用。sgen.sgen选项(look here查看如何调用)。<代码>H234<代码>H135查看与MSMQ一起使用二进制序列化。<代码>H236<代码>H137密切关注通过客户端队列发送的类型。<代码>H238<代码>F239https://stackoverflow.com/questions/11216415
复制相似问题