Десериализация графа объектов из MSMQ, который был поставлен в очередь с использованием WCF и NetMsmqBinding - PullRequest
0 голосов
/ 07 декабря 2011

Я проделал некоторую работу, используя MSMQ с WCF и NetMsmqBinding для генерации сообщений и удаления их из очереди по мере их поступления.Я также стандартизировал свое решение, используя граф объектов в качестве тела сообщения.Этот объект содержит метаданные и внутреннюю полезную нагрузку.

Я хотел бы создать инструмент администратора, который может отслеживать очереди и просматривать содержимое сообщений.До сих пор мне не удалось выяснить, как десериализовать Message.Body обратно в граф объектов с помощью библиотек System.Messaging.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 08 ноября 2012

я знаю, что это старый, но для сериализации и возврата любого объекта вы можете сделать следующее:

// Sample

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();
            }
        }

// Вы можете сделать Byte [] w_byte =Person.serialize ();

Person _Person = Person.Desiserile (w_byte);}

1 голос
/ 07 декабря 2011

Есть ли у вас какая-либо область, изменяющая привязки службы 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

...