首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Msmq和sgen for xmlserialization完全失败

Msmq和sgen for xmlserialization完全失败
EN

Stack Overflow用户
提问于 2012-06-27 05:45:15
回答 1查看 567关注 0票数 2

我一直在想办法解决这个问题,任何想法都是非常受欢迎的!

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

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

代码语言:javascript
复制
        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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-27 06:41:37

有一个sgen输出的design limitation。这个限制就是never removed

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

基本上,您不需要运行sgen来提高web服务的服务器端速度,因为XmlSerializer启动时间不是影响其性能的关键因素(与某些类型的客户端相比)。

当然,只要您不将任何XmlAttributeOverrides传递给XmlSerializer的构造函数,就可以在非web服务场景中的服务器端使用sgen

在MSMQ中,可以选择二进制和XML序列化,您的代码在这里选择后者:

代码语言:javascript
复制
qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})

那么让我们来看看MessageQueue是如何创建XmlSerializer的。以下是取自System.Messaging.dll,.NET 4.0的XmlMessageFormatter方法。它的.NET 2.0版本与之类似。

代码语言:javascript
复制
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.
  • Disable时,请避免使用sgen选项(look here查看如何调用)。<代码>H234<代码>H135查看与MSMQ一起使用二进制序列化。<代码>H236<代码>H137密切关注通过客户端队列发送的类型。<代码>H238<代码>F239
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11216415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档