2011-01-18 14 views
2

メッセージサイズを取得するためにDataContractSerializerを使用してWCFメッセージをシリアル化しようとしています(サービストレースビューアを使用せずに)。以下は、コードスニペットです:DataContractSerializerを使用してWCFメッセージをシリアル化する方法は?

public void BeforeSendReply(ref Message reply, object correlationState) 
     { 
      byte[] bytes = null; 
      var messageBuffer = reply.CreateBufferedCopy(Int32.MaxValue); 
      var message = messageBuffer.CreateMessage(); 
      var dcs = new DataContractSerializer(typeof(Message)); 
      using (var ms = new MemoryStream()) 
      { 
       dcs.WriteObject(ms, message); 
       bytes = ms.ToArray(); 
       Console.WriteLine(String.Format("Message size = {0}", bytes.Count())); 
      } 
     } 

そうで、それは次の例外発生します

タイプ 'System.ServiceModel.Channels.BodyWriterMessage' をシリアル化することはできませんが。 を DataContractAttribute属性で、それに をDataMemberAttribute属性でシリアル化するすべてのメンバーを示す とマーキングします。 タイプeがコレクションの場合は、 CollectionDataContractAttributeを使用して とマークします。

何ができますか?

+0

.NETのどのバージョンを使用していますか?あなたはv3.5(SP1ではなく)を使用していないことを確認できますか? –

答えて

0

シリアライズする必要がある場合は、Messageのインスタンスを作成済みの状態でWriteMessage(XmlWriter)にコールすることができます。

1

Messageクラスは、データコントラクト型またはXmlシリアライザ型ではありません。 WCFの特別なケースです。長さを調べるには、コードを次のように表示します。

public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     var messageBuffer = reply.CreateBufferedCopy(Int32.MaxValue); 
     var message = messageBuffer.CreateMessage(); 

     using (var ms = new MemoryStream()) 
     { 
      var xw = XmlWriter.Create(ms); 
      message.WriteMessage(xw); 
      Console.WriteLine(String.Format("Message size = {0}", ms.Length)); 
     } 
    } 
関連する問題