Сериализация MSMQ и ProtoBuf-Net c # - PullRequest
2 голосов
/ 19 октября 2011

У меня есть класс со многими свойствами, одним из которых является свойство byte [].Я хотел бы отправить этот класс на другой сервер, используя MSMQ.Но перед отправкой я хотел бы сериализовать его с помощью ProtoBuf-Net.Можно ли подключить сериализатор ProtoBuf-Net к MSMQ?

Честно говоря, я не понимаю, как отправить класс в очередь.Я попытался использовать приведенный ниже код для помещения класса в очередь MSMQ, но получил исключение «Произошла ошибка при создании документа XML».

EntityBase - это класс, который я хотел бы отправить.Ранее я использовал свою собственную систему обмена сообщениями на основе файловой системы и ProtoBuf-Net для сериализации класса.

const string queueName = @".\private$\TestQueue";

private static void SendMessageToQueue(EntityBase entity)
{
    // check if queue exists, if not create it
    MessageQueue msMq = null;
    if (!MessageQueue.Exists(queueName))
    {
        msMq = MessageQueue.Create(queueName);
    }
    else
    {
        msMq = new MessageQueue(queueName);
    }
    try
    {

        msMq.Send(entity);
    }
    catch (MessageQueueException ee)
    {
        Console.Write(ee.ToString());
    }
    catch (Exception eee)
    {
        Console.Write(eee.ToString());
    }
    finally
    {
        msMq.Close();
    }
    Console.WriteLine("Message sent ......");
}

1 Ответ

2 голосов
/ 19 октября 2011

Мой совет: отправьте либо string, либо byte[] в качестве сообщения; Вы можете сделать это как:

byte[] body;
using(var ms = new MemoryStream()) {
    Serializer.Serialize(ms, entity);
    body = ms.ToArray();
}

и затем Send(body), или, если вы хотите string, тогда Send(Convert.ToBase64String(body)). И поменять это как другой конец.

Существует также механизм передачи Message вместе с IMessageFormatter, но я не уверен, что оно того стоит. Пример чтения:

Message msg = // receive
byte[] body = (byte[])msg.Body;
EntityBase entity;
using(var ms = new MemoryStream(body)) {
    entity = Serializer.Deserialize<EntityBase>(ms);
}

или (если хотите передать string):

string base64 = (string)msg.Body;
byte[] body = Convert.FromBase64String(base64);
// as before
...