cocoa - usar - NSCoder vs NSDictionary, ¿cuándo usas qué?
componentes de la cocoa (4)
Creo que estás un poco confundido, NSDictionary es una estructura de datos, también implementa el protocolo NSCoding. Entonces, en esencia, podría poner todos sus datos en un NSDictionary y luego codificarse a sí mismo, o puede implementar el protocolo NSCoding y codificar su árbol de objetos utilizando la API de NSCoder. Según el tipo de objeto NSCoder transferido al método encodeWithCoder: es el resultado de su codificación.
Estoy tratando de encontrar la manera de decidir cuándo utilizar NSDictionary o NSCoder / NSCoding.
Parece que para las listas de propiedades generales y tal que NSDictionary es la manera más fácil de hacerlo que genera archivos XML que son fácilmente editables fuera de la aplicación.
Al tratar con clases personalizadas que contienen datos o posiblemente otras clases personalizadas anidadas en el interior, parece que NSCoder / NSCoding sería la mejor ruta ya que pasará por todas las clases de objetos contenidos y las codificará también cuando se use un comando de archivo.
Parece que NSDictionary necesitaría más trabajo para obtener todas las propiedades o características de datos en un solo nivel para poder guardarlo, mientras que NSCoder / NSCoding codificaría automáticamente las clases personalizadas anidadas que implementan la interfaz NSCoding.
Aparte de que se trata de datos binarios y no editables fuera de su aplicación, ¿hay alguna razón real para usar uno sobre el otro? Y a lo largo de esas líneas, ¿hay un indicador de qué manera debe inclinarse entre los dos? ¿Me estoy perdiendo algo obvio?
La documentación de Apple sobre gráficos de objetos tiene esto que decir:
Las serializaciones de Mac OS X almacenan una jerarquía simple de objetos de valor, como diccionarios, matrices, cadenas y datos binarios. La serialización solo conserva los valores de los objetos y su posición en la jerarquía. Múltiples referencias al mismo objeto de valor pueden dar como resultado múltiples objetos cuando se deserializan. La mutabilidad de los objetos no se mantiene.
...
Los archivos Mac OS X almacenan un gráfico de objetos arbitrariamente complejo. El archivo conserva la identidad de cada objeto en el gráfico y todas las relaciones que tiene con todos los otros objetos en el gráfico. Cuando se desarchiva, el gráfico de objeto reconstruido debe, con algunas excepciones, ser una copia exacta del gráfico de objeto original.
La forma en que interpreto esto es que, si desea almacenar valores simples, la serialización (usando un NSDictionary, por ejemplo) es una buena forma de hacerlo. Si desea almacenar un gráfico de objetos de tipos arbitrarios, con exclusividad y mutabilidad preservadas, usar archivos (con NSCoder, por ejemplo) es su mejor opción.
También puede leer la Guía de Programación de Archivos y Serializaciones de Apple para Cocoa , de la cual la página anterior sobre gráficos de objetos es una parte, ya que cubre bien este tema.
Olvidé enumerar lo que recomendaría.
NSCoding puede estar bien en ciertas situaciones: si solo estás haciendo algo rápido y simple (aunque tienes que escribir mucho código, dos métodos por clase para ser serializados). También puede estar bien si no le preocupa la compatibilidad con otras aplicaciones.
Exportar / importar a través de listas de propiedades (tal vez usando la clase NSPropertyListSerializaion) es una buena solución. Las listas basadas en XML son fáciles de crear y editar. La principal ventaja de las listas es que no estás atando el formato de archivo solo a tu aplicación.
También puede crear su propio formato de archivo basado en XML y leer / escribir con NSXMLDocument API y sus amigos. Esto realmente no es mucho más trabajo que usar listas de propiedades.
NO soy un gran admirador de usar NSCoding / NSCoder / NSArchiver (¡tenemos que elegir un nombre!) Para serializar un gráfico de objetos a un archivo.
Los archivos creados de esta manera son increíblemente frágiles. Si guardas un objeto de la clase Foo entonces, por suerte, debes asegurarte de que cuando cargues los datos volverás a tener una clase Foo en tu aplicación.
Esto dificulta la serialización basada en NSCoder desde la perspectiva de compartir archivos con otras aplicaciones o incluso reenviar la compatibilidad con su futura aplicación.