【问题标题】:Deserializing an object graph from MSMQ that was enqueued using WCF and NetMsmqBinding从使用 WCF 和 NetMsmqBinding 排队的 MSMQ 反序列化对象图
【发布时间】:2012-01-14 16:11:29
【问题描述】:

我已经使用带有 WCF 的 MSMQ 和 NetMsmqBinding 完成了一些工作,以生成消息并在它们到达时将它们出列。我还通过使用对象图作为消息体来标准化我的解决方案。该对象包含元数据和内部负载。

我想构建一个可以监控队列和查看消息内容的管理工具。到目前为止,我一直没有成功弄清楚如何使用 System.Messaging 库将 Message.Body 反序列化回对象图中。

有什么想法吗?

【问题讨论】:

  • 到目前为止您尝试过什么?有任何错误信息吗?另外,你见过队列资源管理器吗? cogin.com/mq
  • 默认情况下,只需将 message.Body 作为一个对象访问,就会得到典型的 InvalidOperationException “找不到能够读取此消息的格式化程序”。使用 XmlMessageFormatter,它会爆炸,因为内容不是有效的 XML。使用 BinaryFormatter,它也会失败并显示“无法反序列化作为参数传递的消息。无法识别序列化格式。”我刚刚开始尝试使用一种新方法,但仍然没有运气。
  • 你可能做不到。 NetMsmqBinding 不会简单地将您的对象图序列化为消息并将消息排入队列。消息正文的前面添加了一些协议位。

标签: wcf serialization msmq


【解决方案1】:

你有任何改变 WCF 服务绑定的范围吗?

如果您使用 MsmqIntegrationBinding 而不是 netMsmqBinding,则可以在绑定中指定一系列格式化程序选项。例如

<service name="MyQueueListenner">

    <!-- Active X endpoint -->
    <endpoint address="msmq.formatname:DIRECT=OS:.\private$\myQueue"
              binding="msmqIntegrationBinding"
              bindingConfiguration="ActiveXBinding"
              contract="MyContract" />

    <!-- .Net endpoint-->
    <endpoint address="msmq.formatname:DIRECT=OS:.\private$\myOtherQueue"
              binding="msmqIntegrationBinding"
              bindingConfiguration="DotNetBinding"
              contract="MyContract" />

  </service>
  ...

  <msmqIntegrationBinding>
    <binding serializationFormat="ActiveX" name="ActiveXBinding" durable="false" exactlyOnce="false">
      <security mode="None" />
    </binding>
    <binding serializationFormat="Xml" name="DotNetBinding" durable="false" exactlyOnce="false">
      <security mode="None" />
    </binding>
  </msmqIntegrationBinding>

这允许您使用全系列的格式化程序,为您的基于 System.Messaging 的嗅探器提供最大范围的互操作性。

值的完整列表在这里: http://msdn.microsoft.com/en-us/library/system.servicemodel.msmqintegration.msmqmessageserializationformat.aspx

【讨论】:

  • 我将此标记为正确答案有两个原因。 1)这是唯一一个被提供的,2)它让我走上了正确的道路。我怀疑可能有一些东西可以在仍然使用 NetMsmqBinding 的同时读取和反序列化对象,但它需要反序列化消息中的底层肥皂信封并解决命名空间冲突、合同参数等。我尝试这样做但它是很乱。使用 MsmqIntegrationBinding 在嗅探器方面要干净得多,但在我的消息传递基础架构中,我必须对所有合同方法使用 MsmqMessage
【解决方案2】:

我知道这是旧的,但要序列化和返回任何对象,您可以执行以下操作:

//示例

enter code here

public person class
{
public int Id {get;set;}
public string Name {get;set;}

 public static person Desserialize(byte[] data)
        {
            person result = new person ();
            using (MemoryStream m = new MemoryStream(data))
            {
                using (BinaryReader reader = new BinaryReader(m))
                {
                    result.id = reader.ReadInt32();
                    result.Name = reader.ReadString();

                }
            }
            return result;
        }



public byte[] Serialize()
        {
            using (MemoryStream m = new MemoryStream())
            {
                using (BinaryWriter writer = new BinaryWriter(m))
                {
                    writer.Write(id);
                    writer.Write(Name);

                }
                return m.ToArray();
            }
        }

// 你可以这样做 字节[] w_byte = Person.serialize();

Person _Person = Person.Desiserile(w_byte); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多