У меня есть обычное исключение, которое принимает пару строк в ctor, за которым следует обычный параметр Exception innerException
. Класс исключения украшен [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"));
Любая идея, почему это одна сериализации терпит неудачу и/или как отлаживать эту проблему?
.NET 4.6.1 и 4.14.0 FluentAssertions
EDIT:
Учитывая то, что @Evk обнаружил, я попытался вручную сериализации/десериализации Exception с 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- класс с использованием-JSON-нетто-с)? Этот вопрос касается Json.NET, но 'BinaryFormatter' использует один и тот же конструктор для сериализации исключений. В отличие от этого вопроса, 'BinaryFormatter' требует, чтобы ваш конструктор вызывал конструктор' base'. – dbc
На самом деле то же самое можно воспроизвести с помощью только «нового исключения» («некоторая ошибка»). Должно() BeBinarySerializable(); », поэтому это некоторая ошибка в библиотеке FluentAssertion, а не то, что ваши исключения действительно не сериализуемы. – Evk