2016-10-05 13 views
1

私は、最後のパラメータである通常のException innerExceptionが続く、ctorの中の2つの文字列を取るカスタム例外を持っています。例外クラスは[Serializable]で飾られています。この例外クラスMyExceptionMyBaseExceptionから継承し、次にExceptionを継承します。バイナリは.NET Exception派生クラスをシリアル化します。 FluentAssertionsによるユニットテスト

私はすべてのctorパラメーターが水和して脱水することを正しくテストしています。これは動作します:

var error = new MyException("entityname1"); 
error.Should().BeBinarySerializable(); 

は、これは動作しません:

var error = new MyException("entityname1", 
    new InvalidOperationException("some error")); 
error.Should().BeBinarySerializable(); 

それは与える:スローさ

Expected MyException with message "Unable to sign-in “entityname1”." 
to be serializable, but serialization failed with: 

Expected member InnerException 
to be System.InvalidOperationException with message \"some error\"\n, 
but found System.InvalidOperationException with message \"some error\" 

エラーは、問題のアイデアを与えるかもしれない何のInnerException情報を持っていません。

興味深いことに、これは動作します:

var error = new MyException("entityname1", new MyOtherException("some error")); 

任意のアイデアその1つのシリアル化が失敗したおよび/またはどのように問題をデバッグするために、なぜ?

.NET 4.6.1とFluentAssertions 4.14.0

EDIT:

@Evkが発見されたものを考えると、私は手動でBinaryFormatterで例外をデシリアライズ/シリアライズしようと、正常に動作するようです:

var formatter = new BinaryFormatter(); 

var source = new Exception("some error"); 

byte[] buffer; 
using (var stream = new MemoryStream()) 
{ 
    formatter.Serialize(stream, source); 

    buffer = new byte[stream.Length]; 

    stream.Position = 0; 
    stream.Read(buffer, 0, buffer.Length); 
} 

using (var stream = new MemoryStream(buffer)) 
{ 
    var ex = (Exception)formatter.Deserialize(stream); 

    ex.ToString().Should().Be(source.ToString()); 
} 

これはおそらくFluentAssertionsのバグです。

+0

は、最初に内部例外を投げるとキャッチでそれをチェックしてみ? (これはちょうどランダムな推測です)。また、[バグログ](https://github.com/dennisdoomen/fluentassertions/issues)にチェックしてもらえましたか、おそらくあなた自身のファイルでもありますか? –

+0

[この質問](https://stackoverflow.com/questions/3422703/how-to-deserialize-object-derived-from-exception-html)で必要とされているように、すべてのカスタム例外タイプにストリーミングコンストラクタがありますか? class-using-json-net-c)?その質問はJson.NETに関するものですが、 'BinaryFormatter'は例外のシリアル化に同じコンストラクタを使用します。その質問とは異なり、 'BinaryFormatter'はコンストラクタが' base'コンストラクタを呼び出す必要があります。 – dbc

+0

実際には、 "新しいException("何らかのエラー ")であれば再現可能です。BeBinarySerializable();"、FluentAssertionライブラリのバグですので、例外は実際にはシリアル化できません。 – Evk

答えて

関連する問題