2

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

我在 vb.net 中有一个使用 MSMQ 的客户端/侦听器应用程序,当我不使用 sgen.exe 在编译时生成序列化时,它可以 100% 正常工作。

使用 sgen 时,它在侦听器部分失败。

        qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})

        m = qOrders.EndReceive(e.AsyncResult)

它在 mmBody 上的炸弹有错误"Cannot deserialize the message passed as an argument. Cannot recognize the serialization format.",其余属性也有没有接收到值的错误。

该程序集具有强名称,并且 App.XmlSerializers.dll 也已正确签名。我知道使用了 dll,因为在程序运行时我无法删除它。

InfoMessage 类是一个简单的公共类,具有 3 个公共字符串成员。使用 Reflector 检查 dll,我确实看到 sgen 生成了一个 InfoMessageSerializer 类。

问题不在客户端,因为我删除了 dll 并运行了侦听器,它照常工作。

那么,这里有什么问题呢?:o

谢谢,

约翰

编辑:链接到监听器源: http: //pastebin.com/TqWfLVJ0

4

1 回答 1

1

输出存在设计限制sgen这个限制从未被删除

这些生成的程序集不能用于 Web 服务的服务器端。此工具仅适用于 Web 服务客户端和手动序列化场景。

基本上,您不希望运行sgen以使 Web 服务的服务器端更快,因为XmlSerializer启动时间不是其性能的关键因素(与某些类型的客户端相比)。

当然,在非web服务的场景下sgen 可以在服务端使用,只要不XmlAttributeOverridesXmlSerializer.

使用 MSMQ,可以选择二进制和 XML 序列化,您的代码在此处选择后者:

qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})

那么让我们看看如何MessageQueue创建一个XmlSerializer. 以下是XmlMessageFormatter取自System.Messaging.dll.NET 4.0 的方法。它的 .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 服务服务器端代码不同。尽管如此,还有其他人在将XmlMessageFormattersgen.

我的猜测是,sgen它仍然可以与 MSMQ 一起使用,因为 MSMQ 不使用XmlAttributeOverrides,但是您必须确保您没有使用proxytypes命令行选项,并且您仍然在 Microsoft 测试过的范围之外。

我建议看看这些可能性:

  • 避免sgen与 MSMQ 一起使用。
  • 避免将/proxytypes选项与sgen.
  • 如果您从项目文件SGenUseProxyTypes中调用,请禁用(查看此处了解如何)。sgen
  • 看看使用 MSMQ 的二进制序列化。
  • 密切注意您通过客户端队列发送的类型。
于 2012-06-26T22:41:37.160 回答