web-dev-qa-db-ja.com

SerializationExceptionを回避する方法:LogicalCallContextを使用するコンポーネントをテストするときに、メンバーXXXのタイプが解決されない

EFがApp.configから情報を読み込もうとすると、ユニットテスト(NUnit)コードで次の例外が発生し始めました。

System.Runtime.Serialization.SerializationException : Type is not resolved for member [my type name], [my Assembly name]

これは、NUnit GUIランナーとR#のVS統合ランナーの両方で発生します。この問題を再現する簡単な単体テストを次に示します。

[Test]
public void Test()
{
    // adding 
    // ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    // here fixes things, probably because the configuration is cached

    CallContext.LogicalSetData("FooSlot", new Foo()); // removing this line fixes things
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // fails with above exception
}

[Serializable] // removing this gives a different exception complaining that Foo is not Serializable
public class Foo // : MarshalByRefObject // this fixes things
{ 
}

Fusion Log Viewerを使用して、失敗の原因が

FILE_NOT_FOUND HRESULT

エラー。基本的に、構成を開くと、どういうわけかFooオブジェクトが元の(nunitランナー)アプリドメインに送り返され、アセンブリが読み込まれますが、binフォルダーにないため、アセンブリを見つけることができません。実際、私はアセンブリをNUnitランナーbinフォルダーにコピーすることも、問題を修正する別の方法であることを確認しました。

現時点では、MarshalByRefObjectを使用するのが最善の方法のようです。ただし、より良いオプションがある場合や、何が起こっているのか、その理由を正確に説明できる人がいる場合は、ここに参加してください。ここでMarshalByRefObjectを使用することに不利な点はありますか?

これは この質問 とは異なります。私はすでにMarshalByRefObjectを潜在的なソリューションとして識別しており、問題をより深く理解しようとしています/ MarshalByRefObjectの意味を理解しようとしています。その投稿への答えは、MarshalByRefObjectへのコールアウトであり、有用な詳細はありません。

30
ChaseMedallion

これは、なぜこのエラーが発生するのかについての良い説明だと思います。

VS 2010の単体テスト内で論理呼び出しコンテキストを使用することは可能ですか?

これでいいオプションを探しました。 MarshalByRefObject以外の答えは見つかりません。では、なぜオブジェクトを継承する必要があるのでしょうか。いい説明です

値によるマーシャル

オブジェクトは、それらが作成されたアプリケーションドメインでのみ有効です。オブジェクトをパラメーターとして渡したり、結果として返したりしようとすると、オブジェクトがMarshalByRefObjectから派生したものか、Serializableとしてマークされていない限り、失敗します。オブジェクトがSerializableとしてマークされている場合、オブジェクトは自動的にシリアル化され、1つのアプリケーションドメインから別のアプリケーションドメインに転送され、逆シリアル化されて、2番目のアプリケーションドメインにオブジェクトの正確なコピーが作成されます。このプロセスは通常、値によるマーシャルと呼ばれます。

これはソースです。オブジェクト直列化の概念を理解するのに適しています

https://msdn.Microsoft.com/en-us/library/ms973893.aspx

この質問をありがとう、私は良いことを探して学びました。

5
Sercan Timoçin