2011-10-19 9 views
2

私は多くのプロパティを持つクラスを持っています。そのうちの1つはbyte []プロパティです。このクラスをMSMQを使用して別のサーバーに送信したいと思います。しかし、それを送信する前に、ProtoBuf-Netを使ってシリアル化したいと思います。 ProtoBuf-NetシリアライザをMSMQに取り付けることは可能ですか?MSMQとProtoBuf-Netのシリアル化C#

率直に言って、クラスをキューに送信する方法はわかりません。私はMSMQキューにクラスを配置するのに以下のコードを使用しようとしましたが、例外が発生しました。 "XMLドキュメントの生成中にエラーが発生しました。

EntityBaseは、私が送信したいクラスです。以前は、自分のFile Systemベースのメッセージングシステムと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 ......"); 
} 
+4

Protobug-Netの?それは良質の判断ですか? –

+0

申し訳ありませんが、Protobuf-NET、あなたの製品は、シリアル化のニーズに優れています:) – Tomas

答えて

2

私のアドバイスは、次のようになります。メッセージとしてstringまたはbyte[]のいずれかを送信します。 Send(Convert.ToBase64String(body))その後、

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

、その後Send(body)、またはあなたがstringをしたい場合:あなたはこれを行うことができます。これを反対側と逆にする。

MessageIMessageFormatterと一緒に渡す仕組みもありますが、それが価値があるかどうかはわかりません。読書の例:

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