2

私はこれを利用するために頭を叩いてきました。どんなアイデアでも大歓迎です!

MSMQ を使用して vb.net にクライアント/リスナー アプリケーションがあり、sgen.exe を使用してコンパイル時にシリアル化を生成しない場合、100% 正常に動作します。

sgen を使用すると、リスナー部分で失敗します。

        qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})

        m = qOrders.EndReceive(e.AsyncResult)

mmBody に爆弾を投下すると、エラーが発生"Cannot deserialize the message passed as an argument. Cannot recognize the serialization format."し、残りのプロパティにも値を受信できないというエラーが発生します。

アセンブリには厳密な名前が付けられており、App.XmlSerializers.dll も正しく署名されています。プログラムの実行中にdllを削除できないため、dllが使用されていることはわかっています。

InfoMessage クラスは、3 つのパブリック文字列メンバーを持つ単純なパブリック クラスです。Reflector で dll を調べると、sgen が InfoMessageSerializer クラスを生成していることがわかります。

dll を削除してリスナーを実行するため、問題はクライアント側ではなく、通常どおりに動作します。

それで、ここで何が間違っているのでしょうか?:o

ありがとう、

ジョン

編集: リスナー ソースへのリンク: http://pastebin.com/TqWfLVJ0

4

1 に答える 1

1

出力の設計上の制限がありsgenます。この制限は取り除かれませんでした:

これらの生成されたアセンブリは、Web サービスのサーバー側では使用できません。このツールは、Web サービス クライアントおよび手動シリアル化シナリオ専用です。

sgen基本的に、Web サービスのサーバー側を高速化するために実行することは期待されていませんXmlSerializer。これは、(一部の種類のクライアントとは対照的に) 起動時間はパフォーマンスの重要な要素ではないためです。

もちろん、のコンストラクターに何も渡さない限り、Web サービス以外のシナリオでサーバー側で使用sgen できます。XmlAttributeOverridesXmlSerializer

MSMQ では、バイナリと XML のシリアル化の選択肢があり、ここではコードで後者を選択します。

qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})

MessageQueueそれでは、を作成する方法を見てみましょうXmlSerializer。以下は、.NET 4.0XmlMessageFormatterから取った方法です。System.Messaging.dll対応する .NET 2.0 も同様です。

private void CreateTargetSerializerTable()
{
  if (!this.typeNamesAdded)
  {
    for (int index = 0; index < this.targetTypeNames.Length; ++index)
    {
      Type type = Type.GetType(this.targetTypeNames[index], true);
      if (type != (Type) null)
        this.targetSerializerTable[(object) type]
          = (object)new XmlSerializer(type);
    }
    this.typeNamesAdded = true;
  }
  if (!this.typesAdded)
  {
    for (int index = 0; index < this.targetTypes.Length; ++index)
      this.targetSerializerTable[(object) this.targetTypes[index]] 
        = (object)new XmlSerializer(this.targetTypes[index]);
    this.typesAdded = true;
  }
  if (this.targetSerializerTable.Count == 0)
    throw new InvalidOperationException(Res.GetString("TypeListMissing"));
}

ご覧のとおりXmlAttributeOverrides、フレームワーク内の Web サービス サーバー側コードとは異なり、MSMQ は を提供しません。それでも、XmlMessageFormattersgen.

私の推測では、sgenMSMQ は を使用しないため、引き続き MSMQ で動作XmlAttributeOverridesさせることができますが、proxytypesコマンド ライン オプションを使用していないこと、および Microsoft がこれまでにテストした範囲外に移動していることを確認する必要があります。

これらの可能性を検討することをお勧めします。

  • sgenMSMQ との併用は避けてください。
  • /proxytypesオプションと一緒に使用しないでくださいsgen
  • プロジェクト ファイルからSGenUseProxyTypes呼び出す場合は無効にします (方法については、こちらを参照してください)。sgen
  • MSMQ でのバイナリ シリアル化の使用を検討してください。
  • クライアント側のキューを介して送信するタイプに細心の注意を払ってください。
于 2012-06-26T22:41:37.160 に答える