Msmq和sgen for xmlserialization完全失败

时间:2012-06-26 21:45:15

标签: .net vb.net xml-serialization msmq xmlserializer

我一直在用这个来敲打我的头来利用。任何想法都非常受欢迎!

我在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

1 个答案:

答案 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选项。
  • 如果您从项目文件中调用SGenUseProxyTypeslook here以查看方式),请停用sgen
  • 使用MSMQ使用二进制序列化。
  • 密切注意您通过客户端队列发送的类型。