YAML से एक वस्तु initialize
विधि का उपयोग नहीं करता deserializing क्योंकि सामान्य रूप से ऑब्जेक्ट्स इवेंट वैरिएबल (जो डिफ़ॉल्ट यमल सीरियलाइजेशन स्टोर्स है) और पैरामीटर initialize
के बीच कोई पत्राचार नहीं है।
उदाहरण के लिए, एक initialize
कि इस तरह दिखता है के साथ एक वस्तु (कोई अन्य उदाहरण चर के साथ) पर विचार करें:
def initialize(param_one, param_two)
@a_variable = some_calculation(param_one, param_two)
end
अब जब इस का एक उदाहरण deserialized है, YAML प्रोसेसर @a_variable
के लिए एक मूल्य है , लेकिन initialize
विधि के लिए दो पैरामीटर की आवश्यकता है, इसलिए यह इसे कॉल नहीं कर सकता है। यहां तक कि यदि आवृत्ति चर की संख्या initialize
पर पैरामीटर की संख्या से मेल खाती है, तो यह आवश्यक नहीं है कि वे किस मामले से मेल खाते हों, और भले ही वे प्रोसेसर को आदेश नहीं जानते कि वे initialize
पर भेजे गए हैं।
यारिल को रूबी ऑब्जेक्ट को क्रमबद्ध करने और deserializing करने के लिए डिफ़ॉल्ट प्रक्रिया serialization के दौरान सभी आवृत्ति चर (उनके नामों के साथ) लिखना है, तो जब वर्ग के एक नए उदाहरण आवंटित deserializing और बस इस पर एक ही उदाहरण चर सेट नया उदाहरण
बेशक कभी-कभी आपको इस प्रक्रिया के अधिक नियंत्रण की आवश्यकता होती है। यदि आप साइको यमल प्रोसेसर (जो रूबी 1.9.3 में डिफ़ॉल्ट है) का उपयोग कर रहे हैं तो आपको encode_with
(क्रमबद्धता के लिए) या init_with
(deserialization के लिए) विधियों को लागू करना चाहिए।
क्रमबद्ध करने के लिए, यदि coder
object पास कर रहा है, तो साइप्रस encode_with
किसी ऑब्जेक्ट की विधि को कॉल करेगा। यह ऑब्जेक्ट आपको यह निर्दिष्ट करने की अनुमति देता है कि वस्तु को यमल में कैसे प्रदर्शित किया जाना चाहिए - आम तौर पर आप इसे केवल हैश की तरह मानते हैं।
अक्रमांकन के लिए, साइक init_with
विधि कॉल करेगा कि क्या यह बजाय ऊपर वर्णित डिफ़ॉल्ट प्रक्रिया का उपयोग कर, फिर से एक coder
वस्तु उत्तीर्ण होने की अपनी वस्तु पर मौजूद है। इस बार coder
में यमल में वस्तुओं के प्रतिनिधित्व के बारे में जानकारी होगी।
ध्यान दें कि आपको दोनों विधियां प्रदान करने की आवश्यकता नहीं है, यदि आप चाहें तो केवल एक ही प्रदान कर सकते हैं। यदि आप दोनों प्रदान करते हैं, तो coder
ऑब्जेक्ट जो आपको init_with
में पारित किया गया है, वह आवश्यक रूप से उसी विधि के बाद encode_with
पर पारित होने जैसा ही होगा।
उदाहरण के तौर पर, किसी ऑब्जेक्ट पर विचार करें जिसमें कुछ उदाहरण चर हैं जिन्हें दूसरों से गणना की जाती है (शायद बड़ी गणना से बचने के लिए अनुकूलन के रूप में), लेकिन यमल को क्रमबद्ध नहीं किया जाना चाहिए।
class Foo
def initialize(first, second)
@first = first
@second = second
@calculated = expensive_calculation(@first, @second)
end
def encode_with(coder)
# @calculated shouldn’t be serialized, so we just add the other two.
# We could provide different names to use in the Yaml here if we
# wanted (as long as the same names are used in init_with).
coder['first'] = @first
coder['second'] = @second
end
def init_with(coder)
# The Yaml only contains values for @first and @second, we need to
# recalculate @calculated so the object is valid.
@first = coder['first']
@second = coder['second']
@calculated = expensive_calculation(@first, @second)
end
# The expensive calculation
def expensive_calculation(a, b)
...
end
end
जब आप YAML को इस वर्ग का एक उदाहरण डंप, यह कुछ इस तरह दिखेगा, calculated
मूल्य के बिना:
--- !ruby/object:Foo
first: 1
second: 2
जब आप इस YAML वापस रूबी में लोड, निर्मित ऑब्जेक्ट होगा @calculated
इंस्टेंस वैरिएबल सेट है।
क्या आप init_with
के भीतर से सकता है कॉल initialize
चाहता था, लेकिन मुझे लगता है कि यह बेहतर होगा एक नई वर्ग के उदाहरण आरंभ, और YAML से एक मौजूदा उदाहरण deserializing के बीच स्पष्ट अलगाव रखने के लिए तो । मैं सामान्य तर्क को उन विधियों में निकालने की अनुशंसा करता हूं जिन्हें बदले में
संभावित डुप्लिकेट: http: // stackoverflow।कॉम/प्रश्न/1823386/कॉलिंग-प्रारंभिक-कब-लोडिंग-ए-ऑब्जेक्ट-सीरियलाइज्ड-साथ-yaml –
वह पोस्ट उपयोगी है, हालांकि यह मेरी समस्या को पूरी तरह से हल नहीं करता है। वाईएएमएल धारा जो मैं पार्सिंग कर रहा हूं वह एक वस्तु से अधिक जटिल है, यह कई वस्तुएं हैं, जिनमें से कुछ दूसरों से बना है। – clementine
क्षमा करें, बस कोशिश कर रहा है। शायद यह अधिक उपयोगी है: _why_ 'YAML :: load' को खोजने के लिए _not_ कॉल 'प्रारंभ करें', स्रोत की जांच करें। : पी या शायद हम एक उत्तर देने वाले के लिए इंतजार कर सकते हैं जो अधिक जानकारी जानता है। मैंने आपकी स्क्रिप्ट में 'd.class == c.class' डालने का प्रयास किया और इसे सत्य मान लिया। तो अपने प्रश्न पर +1। –