我一直在用这个来敲打我的头来利用。任何想法都非常受欢迎!
我在vb.net中使用MSMQ有一个客户端/监听器应用程序,当我不使用sgen.exe在编译时生成序列化时,它可以正常工作。
使用sgen时,它在侦听器部分失败。
qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})
m = qOrders.EndReceive(e.AsyncResult)
它轰炸了m。 m.Body有错误"Cannot deserialize the message passed as an argument. Cannot recognize the serialization format."
,其余属性也有错误,没有收到值。
程序集名称很强,App.XmlSerializers.dll也正确签名。我知道dll已被使用,因为我无法在程序运行时删除它。
InfoMessage类是一个简单的公共类,有3个公共字符串成员。使用Reflector检查dll,我确实看到sgen生成了一个InfoMessageSerializer类。
问题不在客户端,因为我删除了dll并运行了监听器,它正常工作。
那么,这里可能出现什么问题? :○
谢谢,
约翰
编辑:链接到侦听器来源:http://pastebin.com/TqWfLVJ0
答案 0 :(得分:1)
sgen
输出design limitation。此限制为never removed:
这些生成的程序集不能在Web服务的服务器端使用。此工具仅适用于Web服务客户端和手动序列化方案。
基本上,您不应该运行sgen
来使Web服务的服务器端更快,因为XmlSerializer
启动时间不是其性能的关键因素(与某些类型的客户机)。
当然,只要您没有将sgen
传递给构造函数,就可以在非Web服务方案中在服务器端使用XmlAttributeOverrides
XmlSerializer
。
使用MSMQ,可以选择二进制和XML序列化,您的代码在这里选择后者:
qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})
让我们来看看MessageQueue
如何创建XmlSerializer
。以下是从XmlMessageFormatter
,.NET 4.0中获取的System.Messaging.dll
方法。它的.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"));
}
正如您所看到的,与框架中的Web服务服务器端代码不同,MSMQ不提供XmlAttributeOverrides
。不过,还有其他人have trouble将XmlMessageFormatter和sgen
结合起来。
我的猜测是sgen
仍然可以与MSMQ一起使用,因为MSMQ不使用XmlAttributeOverrides
,但你必须确保你没有使用proxytypes
命令行选项,你仍然在微软测试之外的方式。
我建议看看这些可能性:
sgen
与MSMQ一起使用。/proxytypes
使用sgen
选项。SGenUseProxyTypes
(look here以查看方式),请停用sgen
。