1

この LOB アプリケーションは、CSLA ビジネス オブジェクトを使用するクライアント サーバー アプリケーションであり、これらのビジネス オブジェクトは NetDataContractSerializer を使用してシリアル化されています。サーバー側は WCF で実行され、クライアントにはエンドポイントがあります。

これはすべて、.NET 4.5 がインストールされた Windows 7 または Windows 8 からクライアント ソフトウェアを実行している場合に機能します。

最新の .NET 4.5.1 Framework を搭載した Windows 8 または Windows 8.1 でクライアント ソフトウェアを実行すると、次の例外が発生します。

メッセージを逆シリアル化しようとしているときにフォーマッタが例外をスローしました: パラメータ http://ws.lhotka.net/WcfDataPortal:FetchResultを逆シリアル化しようとしているときにエラーが発生しました。InnerException メッセージは、「行 1 位置 11619 のエラーです。名前空間 ' http://schemas.microsoft.com/2003/10/Serialization/Arrays ' からの 'Element' 'm_serializationArray' は想定されていません。要素 'm_keyRehashCount'.' が必要です。詳細については、InnerException を参照してください。

最も内側の例外は

行 1 位置 11619 のエラー。名前空間 ' http://schemas.microsoft.com/2003/10/Serialization/Arrays 'の 'Element' 'm_serializationArray'は予期されていません。要素 'm_keyRehashCount' が必要です。

これについては、stackoverflow または Google で何も見つかりません。CSLA フォーラムに同じ質問を投稿しました。おそらく、Connect にも投稿する必要があります。でも、ここはラッキーかも?

.NET Framework を 4.5.1 に更新する前に、開発環境をバックアップする時間が必要です

考えられる解決策は次の 2 つです。

  • 2008 サーバーを .NET 4.5.1 にアップグレードします。
  • クライアント ソフトウェアに .NET 4.5 の使用を強制する

クライアント ソフトウェアで .NET 4.5 のみを使用するように強制することはできますか? 他のアイデアはありますか?

4

2 に答える 2

3

私は自分の側からこの問題を再現できます。当面の間、これが役立つかどうかを確認するために、いくつかの事実を示したいと思います。

ドキュメントによると、 NetDataContractSerializerは DataContractSerializer よりも制限的です。

NetDataContractSerializer は、1 つの重要な点で DataContractSerializer と異なります。NetDataContractSerializer には、シリアル化された XML に CLR 型情報が含まれていますが、DataContractSerializer には含まれていません。したがって、NetDataContractSerializer は、シリアル化と逆シリアル化の両方の端が同じ CLR 型を共有している場合にのみ使用できます。

4.5.1 の ConcurrentDictionary 型は、ConcurrentDictionary の 4.5 バージョンには見られない m_keyRehashCount という名前のプロパティまたはメンバー変数を追加したと思います。4.5.1 マシンでこのオブジェクトを逆シリアル化しようとすると、シリアライザーはこの欠落しているプロパティを予期し、この例外が発生します。

  <m_keyRehashCount>0</m_keyRehashCount>

この問題を解決するには、いくつかの方法があります。

  1. サーバー マシンも 4.5.1 にアップグレードします。.net 4.5.1 は .net 4.5 への無料アップグレードで、.net 4.5 で見つかったいくつかの互換性の問題も修正されています。

  2. NetDataContractSerializer の代わりに DataContractSerializer を使用してください。これは、シリアル化と逆シリアル化の両方の端でまったく同じ CLR 型を想定していないためです。

  3. ConcurrentDictionary の代わりに Dictionary を使用するように変更します。このタイプは正常に機能することがわかります。
于 2013-10-30T14:58:11.800 に答える