Может ли IFormatter десериализировать объект не имеющего ссылки типа?
Предположим, я сериализовал сторонний объект типа библиотеки с BinaryFormatter
, Сборка, которая не ссылается на эту библиотеку, пытается десериализовать байты. Это будет работать?
Я не ожидаю, что он будет приведен к правильному типу, я просто хочу получить его как object
экземпляр, чтобы я мог сгруппировать его и сериализовать снова.
5 ответов
Это должно работать нормально, но только если эта библиотека развернута с приложением. Вам не нужна прямая ссылка на это.
Во время сериализации BinaryFormatter
хранит полное имя сборки (отображаемое имя, токен открытого ключа, номер версии) вместе с информацией о типе. Этого достаточно для того, чтобы десериализатор отключился и снова загрузил эту сборку. Обратите внимание, что информация о пути не сохраняется, поэтому необходимо развернуть сборку в приложении, которое выполняет десериализацию.
Если вы пытаетесь только временно получить сериализованную информацию, чтобы вы могли сгруппировать ее, можете ли вы просто прочитать необработанные байты из сериализованного потока и сгруппировать их? Может быть в List<byte[]>
пример? Это предполагает, что конечный пункт назначения может сделать некоторые предположения об информации, представленной каждым байтовым массивом.
Нет; если на сам тип не ссылаются (каким-то образом загруженная сборка), то он не может быть создан. Даже если вам не нужно (или вы не хотите) ссылаться на экземпляр строго типизированным способом, сам объект все равно должен быть экземпляром этого типа.
Если сборка доступна (и доступна для обнаружения), она будет загружена, но в строгом смысле этого слова нет, вы не сможете десериализовать тип из полностью не связанной сборки.
Нет, это не сработает, чтобы десериализовать объект, вам нужно обратиться к сборке, в которой этот объект определен.
Да, если вы создадите механизм связывания сериализации, вы можете десериализовать тип в другой тип. Но вы не сможете создать экземпляр исходного типа без его определения (к которому вам потребуется иметь сборку под рукой)