NSCoder против NSDictionary, когда вы используете что? - PullRequest
9 голосов
/ 29 сентября 2008

Я пытаюсь выяснить, как решить, когда использовать NSDictionary или NSCoder / NSCoding?

Похоже, что для общих списков свойств и таких, что NSDictionary - это простой способ создания файлов XML, которые легко редактируются вне приложения.

При работе с пользовательскими классами, которые содержат данные или, возможно, другие пользовательские классы, вложенные внутрь, кажется, что NSCoder / NSCoding будет лучшим маршрутом, поскольку он будет проходить через все содержащиеся в нем классы объектов и кодировать их, а также когда команда архивирования используемый.

NSDictionary кажется, что потребовалось бы больше усилий, чтобы привести все свойства или характеристики данных к одному уровню, чтобы иметь возможность его сохранить, тогда как NSCoder / NSCoding автоматически кодирует вложенные пользовательские классы, которые реализуют интерфейс NSCoding.

Помимо того, что это двоичные данные, а не редактируемые вне вашего приложения, есть ли реальная причина использовать одно над другим? И вдоль этих линий есть индикатор того, каким образом вы должны опираться между ними? Я что-то упускаю из виду?

Ответы [ 4 ]

9 голосов
/ 29 сентября 2008

Документация Apple по объектным графам гласит:

Сериализации Mac OS X хранят простую иерархию объектов значений, таких как словари, массивы, строки и двоичные данные. Сериализация только сохраняет значения объектов и их положение в иерархии. Несколько ссылок на один и тот же объект значения могут привести к множеству объектов при десериализации. Изменчивость объектов не поддерживается.

...

В архивах Mac OS X хранится произвольно сложный граф объектов. Архив сохраняет идентичность каждого объекта в графе и все отношения, которые он имеет со всеми другими объектами в графе. В разархивированном виде восстановленный граф объектов должен, за некоторыми исключениями, быть точной копией исходного графа объектов.

Я интерпретирую это следующим образом: если вы хотите сохранить простые значения , сериализация (например, с использованием NSDictionary) - это отличный способ. Если вы хотите хранить объектный граф произвольных типов с сохранением уникальности и изменчивости, лучше всего использовать архивы (например, с NSCoder).

Возможно, вы также захотите прочитать Руководство по программированию архивов и сериализаций Apple для какао , частью которого является упомянутая выше страница на графах объектов, поскольку она хорошо освещает эту тему.

5 голосов
/ 29 сентября 2008

Я НЕ большой поклонник использования NSCoding / NSCoder / NSArchiver (нам нужно выбрать имя!) Для сериализации графа объектов в файл.

Архивы, созданные таким образом, невероятно хрупки. Если вы сохраняете объект класса Foo, тогда вам нужно убедиться, что при загрузке данных обратно у вас в приложении будет класс Foo.

Это затрудняет сериализацию на основе NSCoder с точки зрения совместного использования файлов с другими приложениями или даже прямой совместимости с вашим будущим приложением.

2 голосов
/ 29 сентября 2008

Я забыл перечислить, что я бы порекомендовал.

NSCoding может быть приемлемым в определенных ситуациях: если вы просто делаете что-то быстрое и простое (хотя вам действительно нужно написать много кода - два метода для каждого класса должны быть сериализованы). Это также может быть хорошо, если вы не беспокоитесь о совместимости с другими приложениями.

Экспорт / импорт через списки свойств (возможно, с использованием класса NSPropertyListSerializaion) является хорошим решением. Списки на основе XML легко создавать и редактировать. Главное преимущество списков заключается в том, что вы не привязываете формат файла только к своему приложению.

Вы также можете создать свой собственный формат файла на основе XML и читать / писать в него, используя NSXMLDocument API и друзей. Это действительно не намного больше работы, чем использование списков свойств.

1 голос
/ 29 сентября 2008

Я думаю, вы немного запутались, NSDictionary - это структура данных, также она реализует протокол NSCoding. Таким образом, по сути, вы могли бы либо поместить все свои данные в NSDictionary и впоследствии кодировать себя, либо вы можете реализовать протокол NSCoding и кодировать дерево объектов с помощью API NSCoder. На основе типа объекта NSCoder, переданного в encodeWithCoder: метод, выводится ваша кодировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...