2008-09-29 11 views
9

मैं यह जानने का प्रयास कर रहा हूं कि NSDictionary या NSCoder/NSCoding का उपयोग कब करें?एनएससीओडर बनाम एनएस डिक्शनरी, आप कब उपयोग करते हैं?

ऐसा लगता है कि सामान्य संपत्ति सूचियों के लिए और ऐसे में NSDictionary जाने का आसान तरीका है जो XML फ़ाइलों को उत्पन्न करता है जो एप्लिकेशन के बाहर आसानी से संपादन योग्य होते हैं।

कस्टम कक्षाओं से निपटने के दौरान जो डेटा या संभावित रूप से अन्य कस्टम वर्गों के अंदर घूमते हैं, ऐसा लगता है कि एनएससीओडर/एनएससीओडीिंग बेहतर मार्ग होगा क्योंकि यह सभी निहित ऑब्जेक्ट क्लास के माध्यम से कदम उठाएगा और साथ ही साथ एक संग्रह कमांड को भी एन्कोड करेगा प्रयोग किया जाता है।

NSDictionary ऐसा लगता है कि यह सभी गुणों या डेटा विशेषताओं को एक ही स्तर पर सहेजने में सक्षम होने के लिए अधिक काम करेगा, जहां एनएससीओडर/एनएससीओडीएन एनएससीओडी इंटरफ़ेस को लागू करने वाले नेस्टेड कस्टम क्लास को स्वचालित रूप से एन्कोड करेगा।

इसके बाइनरी डेटा होने के बावजूद और आपके आवेदन के बाहर संपादन योग्य नहीं है, क्या एक दूसरे का उपयोग करने का वास्तविक कारण है? और उन पंक्तियों के साथ एक संकेतक है कि आपको दोनों के बीच दुबला होना चाहिए? क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?

उत्तर

9

object graphs पर एप्पल के प्रलेखन इस कहना है:

मैक ओएस एक्स serializations दुकान ऐसी शब्दकोशों, सरणियों, स्ट्रिंग्स और बाइनरी डेटा के रूप में मूल्य की वस्तुओं, का एक सरल पदानुक्रम। क्रमबद्धता केवल वस्तुओं के मूल्यों और पदानुक्रम में उनकी स्थिति को संरक्षित करती है। वही मूल्य वस्तु के एकाधिक संदर्भों के परिणामस्वरूप कई वस्तुओं को deserialized किया जा सकता है। वस्तुओं की उत्परिवर्तन बनाए रखा नहीं है।

...

मैक ओएस एक्स अभिलेखागार दुकान एक मनमाने ढंग से जटिल ऑब्जेक्ट ग्राफ। संग्रह ग्राफ में हर ऑब्जेक्ट की पहचान और ग्राफ में अन्य सभी ऑब्जेक्ट्स के साथ सभी रिश्तों को सुरक्षित रखता है। जब अनारक्षित हो, पुनर्निर्मित ऑब्जेक्ट ग्राफ़ को कुछ अपवादों के साथ मूल ऑब्जेक्ट ग्राफ़ की एक सटीक प्रतिलिपि होनी चाहिए।

तरह से मैं इस व्याख्या है कि, यदि आप सरल मान संग्रहीत करना चाहते हैं, क्रमबद्धता (एक NSDictionary का उपयोग कर, उदाहरण के लिए) जाने के लिए एक अच्छा तरीका है। यदि आप ऑब्जेक्ट ग्राफ़ मनमाने ढंग से प्रकारों को संग्रहीत करना चाहते हैं, विशिष्टता और उत्परिवर्तन संरक्षित के साथ, अभिलेखागार (उदाहरण के लिए, एनएससीओडर के साथ) का उपयोग करना आपकी सबसे अच्छी शर्त है।

आप ऐप्पल के Archives and Serializations Programming Guide for Cocoa को भी पढ़ना चाहेंगे, जिसमें से ऑब्जेक्ट ग्राफ पर उपरोक्त पृष्ठ एक हिस्सा है, क्योंकि यह इस विषय को अच्छी तरह से कवर करता है।

1

मुझे लगता है कि आप थोड़ा उलझन में हैं, NSDictionary एक डेटा संरचना है, यह एनएससीओडी प्रोटोकॉल को लागू करने के लिए भी होता है। तो संक्षेप में, आप या तो अपने सभी डेटा को NSDictionary में डाल सकते हैं और बाद में इसे एन्कोड कर सकते हैं, या आप एनएससीओडीआर प्रोटोकॉल को कार्यान्वित कर सकते हैं और एनएससीओडर एपीआई का उपयोग करके अपने ऑब्जेक्ट पेड़ को एन्कोड कर सकते हैं। एनकोड में प्रेषित एनएससीओडर ऑब्जेक्ट के प्रकार के आधार पर विथकोडर: विधि, आपके एन्कोडिंग का आउटपुट है।

+1

मुझे लगता है कि यह स्पष्ट है कि वह संपत्ति सूची क्रमबद्धता बनाम एनएससीओडर सीरियलाइजेशन का जिक्र कर रहा है। – schwa

5

मैं नहीं का उपयोग कर NSCoding/NSCoder/NSArchiver (हम एक नाम लेने के लिए की जरूरत है!) एक फाइल करने के लिए एक वस्तु ग्राफ serialise करने का एक बड़ा प्रशंसक हूँ।

इस तरह से बनाए गए अभिलेखागार अविश्वसनीय रूप से नाजुक हैं। यदि आप क्लास फू के ऑब्जेक्ट को गली से सहेजते हैं तो आपको यह सुनिश्चित करने की ज़रूरत है कि जब आप डेटा को वापस लोड करते हैं तो आपके एप्लिकेशन में क्लास फू है।

यह एनएससीओडर आधारित धारावाहिकता को अन्य अनुप्रयोगों के साथ फ़ाइलों को साझा करने के परिप्रेक्ष्य से या आपके भविष्य के आवेदन के साथ आगे संगतता के परिप्रेक्ष्य से मुश्किल बनाता है।

+2

सहमत हुए। मैं उस मार्ग से नीचे गया और बाद में पछतावा कर दिया। – greenisus

+0

मैं सिर्फ यह सामान सीख रहा हूं, लेकिन ऐसा लगता है कि 'NSKeyedArchiver' और' NSKeyedUnarchiver' [स्कीमा आगे माइग्रेट करें] (https://developer.apple.com/library/mac/#documentation/Cocoa/Cceptceptual /Achchiving/Articles/compatibility.html#//apple_ref/doc/uid/20001055-BCICFFGE) ... और गॉली द्वारा, आप [-setClass: forClassName:] का उपयोग कर सकते हैं (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/Reference/Reference.html#//apple_ref/occ/instm/NSKeyedUnarchiver/setClass%3aforClassName%3a) जब आप डेटा को वापस लोड करते हैं तो कक्षा को बदलने के लिए। – AlexChaffee

2

मैं जो सूचीबद्ध करने की सिफारिश करता हूं उसे सूचीबद्ध करना भूल गया।

कुछ स्थितियों में एनएससीओडी ठीक हो सकता है: यदि आप कुछ त्वरित और सरल कर रहे हैं (हालांकि आपको बहुत सारे कोड लिखना है - प्रति वर्ग दो विधियों को क्रमबद्ध करने के लिए)। यदि आप अन्य अनुप्रयोगों के साथ संगतता के बारे में चिंतित नहीं हैं तो यह भी ठीक हो सकता है।

संपत्ति सूचियों के माध्यम से निर्यात/आयात (शायद एनएसपीप्रर्टी लिस्टसेरियलज़ियन वर्ग का उपयोग करना) एक अच्छा समाधान है। एक्सएमएल आधारित plists बनाने और संपादित करने के लिए आसान हैं। Plists के लिए मुख्य लाभ यह है कि आप केवल अपने आवेदन के लिए फ़ाइल प्रारूप नहीं लगा रहे हैं।

आप अपना स्वयं का एक्सएमएल आधारित फ़ाइल प्रारूप भी बना सकते हैं और NSXMLDocument API और दोस्तों का उपयोग करके इसे पढ़/लिख सकते हैं। संपत्ति सूचियों का उपयोग करने से यह वास्तव में अधिक काम नहीं है।

संबंधित मुद्दे