3

DataContractSerializer同じルートタイプに対してシリアライザーを複数回インスタンス化するというペナルティを回避するために、複数のスレッドで同時に使用される単一のインスタンスをキャッシュしたいと考えています。各スレッドは異なるオブジェクトをシリアル化しますが、DataContractSerializerオブジェクト自体は共有されます。(明らかに、より複雑で正式な XML/XSD スキーマに関連するIDataContractSurrogateorは使用しません。)DataContractResolver

私は大丈夫でしょうか?

System.Runtime.Serialization.DataContractSerializer の「スレッド セーフティ」の下の MSDN には、次のように書かれています。

このクラスのインスタンスは、インスタンスが IDataContractSurrogate または DataContractResolver の実装で使用される場合を除き、スレッド セーフです。

(MSDN スレッド セーフ ガイダンスの典型であるように) これは少しあいまいですが、私のユース ケースが適切であることを示しているようです。個人的な経験、単体テスト、またはそれを示すフレームワークの逆アセンブリを指摘できる場合のボーナス:)

PS これはIs WCF's DataContractSerilaizer thread safe の複製ではないと思いますか? その人の問題は、それ自体のスレッドセーフとは無関係であることが判明したためDataContractSerializerです。

4

1 に答える 1

2

はい、あなたのユースケースは適切です。DataContractResolverIDataContractSurrogateの両方の実装は、 DataContractSerializerのユーザーによって行われます。それらを実装して構成しなかった場合、スレッドの問題はありません (そうでなければ、MSDN のドキュメントは明らかに間違っています)。

さらに進んで、MSDN は DataContractResolver と IDataContractSurrogate の使用を除外しただけだと仮定します。これらは間違った方法で実行される可能性があるためです (つまり、スレッドセーフではありません)。しかし、残念ながら、その証拠はドキュメントにありません。

于 2015-08-24T07:12:45.267 に答える