Почему не словарьбыть сериализованным?Или это может? - PullRequest
3 голосов
/ 01 декабря 2011

(не заметил вопроса, задающего этот вопрос).

Почему нельзя сериализовать словарь?

Большинство ресурсов, веб-сайтов, блогов и т. Д. Говорят, что он не может быть сериализованным,Однако, читая «CLR через C #» 3-е издание, стр. 664 приводит словарь в качестве примера графа объектов, который может быть сериализованным.

Обратите внимание, что в этой главе говорится о двоичной сериализации.Так что, это может быть сериализовано с использованием BinaryFormatter, но не может быть сериализовано в XML?

Или есть ли здесь какая-то разница, что я отсутствует между IDictionary и Dictionary?

Чтобы уточнить ... при каких обстоятельствах можно сериализовать словарь и при каких обстоятельствах его нельзя сериализовать.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 01 декабря 2011

Ответ, который вы ищете, находится по этой ссылке: Класс сериализации, содержащий член словаря

Вам нужно будет сделать свою собственную реализацию или использовать чужую, как вы можете найти по этой ссылке: .NET XML-сериализация получила?

3 голосов
/ 01 декабря 2011

Я думаю, что это всего лишь ограничение XML-сериализатора Microsoft (System.Xml.Serialization.XmlSerializer). Большинство других сериализаторов будут поддерживать словари.

Это не общее ограничение сериализации, даже не XML-сериализация, а только ограничение этой реализации. XmlSerializer в целом довольно слабый.

0 голосов
/ 19 марта 2017

Здесь является причиной, по которой это так:

Объекты восстанавливаются изнутри, и вызывающие методы во время десериализации могут иметь нежелательные побочные эффекты, поскольку вызываемые методы могут ссылаться нассылки на объекты, которые не были десериализованы к моменту вызова.Если десериализованный класс реализует IDeserializationCallback, метод OnSerialization будет автоматически вызываться, когда десериализован весь граф объекта.На этом этапе все дочерние объекты, на которые есть ссылки, полностью восстановлены.Хеш-таблица является типичным примером класса, который трудно десериализовать без использования обработчика событий, описанного выше.Во время десериализации легко получить пары ключ / значение, но добавление этих объектов обратно в хеш-таблицу может вызвать проблемы, поскольку нет гарантии, что классы, полученные из хеш-таблицы, были десериализованы.Поэтому не рекомендуется вызывать методы для хеш-таблицы на этом этапе.
...