2013-07-10 8 views
16

サービス指向アーキテクチャーに移行する際、現在のキューの代わりにWindows Azure Service Busの使用方法を調査し始めました。Azureサービスバスのシリアル化タイプ

ほとんどのドキュメントは明確です。しかし、身体が提供されたときにどのタイプのシリアライゼーションが使用されているかを確認するのは苦労しました。例えば

、のは、私は以下のようBrokeredMessageオブジェクトのインスタンスを作成しましょう:

ICommand sendMessageCommand = new SendMessageCommand 
{ 
    Title = "A new message title", 
    Body = "A new message body" 
}; 

BrokeredMessage brokeredMessage = new BrokeredMessage(sendMessageCommand); 

queueClient.Send(brokeredMessage); 

SendMessageCommandは、単純なDTOは[Serializable]属性でマークされています。私たちの古いキューでは、これはバイナリシリアル化されているため、より速く格納でき、メタデータが保持されます。これは、キューを使用して、pattern outlined hereを使用してコマンドを送信する際に、ジェネリックスと動的タイピングを混在させてコマンドをデシリアライズする受信ワーカーロールを使用する場合に重要です。

のコンストラクタに渡されるボディは、THISの記事によれば、 "Binary XML Serialized"です。私の前提は、これがバイナリフォーマッタを通過した標準のXMLシリアル化であるということです。

さらに、つまり、デフォルトのBrokeredMessageメッセージ本文機能を使用する場合は、私はすべてのオブジェクトがXML Serializableであることを保証しなければならないでしょう、それはすべての問題を含んでいますか? (プライベートフィールドの喪失、ジェネリックを使用したデシリアライズのためのメタデータなし、xmlシリアル化属性)

最後に、このような場合は;この周りに簡単な方法がありますか?私は独自のバイナリシリアル化を行い、BrokeredMessageのプロパティにbyte[]を格納することを検討していました。

答えて

20

the documentationによれば:

BrokeredMessageのコンストラクタに任意 直列化可能なオブジェクトを渡すことによって、メッセージの本文を設定することができるアプリケーション、および 適切DataContractSerializerは次に オブジェクトをシリアル化するために使用される

。あるいは、System.IO.Streamを提供することもできます。あなたが使用している

コンストラクタはthis documentationがあります

はバイナリ XmlDictionaryWriterとDataContractSerializerを使用して、特定 オブジェクトからBrokeredMessageクラスの新しいインスタンスを初期化します。

これは、in this articleで説明されているように、DataContractsとして定義されたメッセージに適しています。

また、this answerに記載されているサロゲートを使用することもできます。

また、your own serializerまたはa streamを指定することもできます。

代わりに、独自のシリアライゼーションを行い、(メッセージプロパティではなく)コンストラクタに提供されるシリアライズ可能オブジェクトとしてバイト配列または文字列を使用することもできます。これは、JSONやprotobufなどのシリアライズフォーマットを使用できるため、相互運用性のための適切なアプローチです。マイクロソフト自身のBest Practices for Performance in Windows Azure Applicationsは、パフォーマンスに影響を及ぼす場合、カスタムまたはサードパーティのシリアル化を使用することを推奨しています。

私はJSONのシリアル化と動的オブジェクトを使用して良い結果を得ました。

+1

ベストプラクティスリンクが無効です – MPavlak

+3

[Azure-Samples GitHubリポジトリ](https://github.com/Azure-Samples/azure-servicebus-messaging-samples)の例の多くは、動的オブジェクトでJSONシリアライゼーションを使用しています。私は、DataContractとDataMemberの属性を使ってモデルを捨てる必要がないので、静的オブジェクトの場合でもこのアプローチを好む。 –