私は、最後のパラメータである通常のException innerException
が続く、ctorの中の2つの文字列を取るカスタム例外を持っています。例外クラスは[Serializable]
で飾られています。この例外クラスMyException
もMyBaseException
から継承し、次に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のバグです。
は、最初に内部例外を投げるとキャッチでそれをチェックしてみ? (これはちょうどランダムな推測です)。また、[バグログ](https://github.com/dennisdoomen/fluentassertions/issues)にチェックしてもらえましたか、おそらくあなた自身のファイルでもありますか? –
[この質問](https://stackoverflow.com/questions/3422703/how-to-deserialize-object-derived-from-exception-html)で必要とされているように、すべてのカスタム例外タイプにストリーミングコンストラクタがありますか? class-using-json-net-c)?その質問はJson.NETに関するものですが、 'BinaryFormatter'は例外のシリアル化に同じコンストラクタを使用します。その質問とは異なり、 'BinaryFormatter'はコンストラクタが' base'コンストラクタを呼び出す必要があります。 – dbc
実際には、 "新しいException("何らかのエラー ")であれば再現可能です。BeBinarySerializable();"、FluentAssertionライブラリのバグですので、例外は実際にはシリアル化できません。 – Evk