При реализации интерфейса ISerializable
в С# мы предоставляем конструктор, который принимает объект SerializationInfo
, а затем запрашивает его с помощью различных методов GetInt32
, GetObject
и т.д., чтобы заполнить поля объекта которые мы пытаемся десериализовать.
Одна из основных причин реализации этого интерфейса, а не просто использование атрибута [Serializable]
, заключается в обратной совместимости: если в какой-то момент мы добавили новые классы в класс, мы сможем поймать SerializationException
, созданный сериализованным, более старую версию класса и обрабатывать их соответствующим образом.
Мой вопрос заключается в следующем: почему мы должны использовать эти исключения для того, что, по сути, управляет потоком? Если я десериализую большое количество классов, которые были сохранены некоторое время назад, потенциально каждое отсутствующее поле в каждом классе генерирует исключение, что вызывает очень плохую производительность.
Почему класс SerializationInfo
не предоставляет методы TryGetValue
, которые просто возвращают false
, если строка имени не присутствовала?