2011-10-27 11 views
6

मैंने सीरियलाइजेशन और सत्यापन के बारे में पिछले प्रश्न पूछा। किसी ने JSON मणि का उपयोग करके उल्लेख किया है जो मुझे to_json विधि के साथ क्रमबद्ध करने के लिए मेरी वस्तु को बताने की अनुमति देता है, हालांकि रुबी जटिल चीजों की बहुत सी चीजें वास्तव में आसानी से करता है, हालांकि फ्लिप पक्ष पर कुछ वास्तव में सरल चीजें काफी जटिल लगती हैं, सीरियलाइजेशन उन चीजों में से एक।जेएसओएन, एक्सएमएल, वाईएएमएल को ऑब्जेक्ट को सीरियलाइज करना?

मैं पता लगाने के लिए अगर वहाँ एक स्वच्छ वस्तु है के लिए एक रास्ता है चाहता हूँ:

class CleanClass 
    attr_accessor :variable1 
    attr_accessor :variable2 
    attr_accessor :variable3 
end 

cleanObject = CleanClass.new 

आदर्श रूप में, मैं नहीं चाहता कि गंदा मॉडल करना चाहते हैं, मैं सिर्फ कुछ करने के लिए इसे पास करना चाहते हैं और यह बताएं कि आउटपुट प्रकार क्या होना चाहिए और इसे अपने जादू को काम करने दें।

एक उदाहरण कुछ की तरह:

jsonOutput = MagicSerializer::Json.Serialize(cleanObject) 
xmlOutput = MagicSerializer::Xml.Serialize(cleanObject) 
yamlOutput = MagicSerializer::Yaml.Serialize(cleanObject) 

revertedJsonObject = MagicSerializer::Json.Unserialize(jsonOutput) 
revertedXmlObject = MagicSerializer::Xml.Unserialize(xmlOutput) 
revertedYamlObject = MagicSerializer::Yaml.Unserialize(yamlOutput) 

मैं कुछ एक वस्तु पारित करने के लिए चाहते हैं, और तार outputted मिलता है, फिर इसे वापस कन्वर्ट करने में सक्षम हो।

मुझे पता है कि ActiveModel में क्रमबद्धता कार्यक्षमता है लेकिन मुझे ऐसा करने के लिए मेरी कक्षा को गंदे करने की आवश्यकता है, और यदि संभव हो तो मैं मॉडल को बदलना नहीं चाहता हूं। ActiveSupport JSON मानदंडों को पूरा करने के लिए प्रतीत होता है क्योंकि मैं इसे बस कॉल कर सकता हूं और यह एक ऑब्जेक्ट लेगा और JSON को थूक देगा, लेकिन मैं अन्य प्रकारों का समर्थन करना चाहता हूं।

कोई और जानकारी बहुत अच्छी होगी!

+0

'JSON.dump (ऑब्जेक्ट) 'और' JSON।पार्स (स्ट्रिंग) ' – Kris

उत्तर

11

रूबी द्विआधारी और YAML के लिए अंतर्निहित automagical क्रमबद्धता/अक्रमांकन गया है।

YAML:

require 'yaml' 
serialized = CleanClass.new.to_yaml 
object = YAML.load(serialized) 

मार्शल:

serialized = Marshal.dump(CleanClass.new) 
object = Marshal.load(serialized) 
+0

हां के बजाय ऑब्जेक्ट पर, मैंने इन्हें देखा है, लेकिन जेसन वर्तमान में मेरे लिए सबसे महत्वपूर्ण है, फिर एक्सएमएल, YAML। तो मैं उम्मीद कर रहा था कि एक मणि या पुस्तकालय होगा जो सरलीकृत इंटरफ़ेस से सबकुछ करता है। – Grofit

+1

JSON प्रारूप पूरी रूबी ऑब्जेक्ट की स्थिति को कैप्चर करने के लिए बहुत सीमित है। इसमें केवल प्राइमेटिव हैं, इसलिए आपको आवृत्ति चर के प्रकार की जानकारी शामिल करने के लिए अपने JSON को कस्टमाइज़ करना होगा। इसके अलावा, यदि लक्ष्य क्रमबद्धता है तो वस्तु को कहीं और पढ़ा जा सकता है, तो आपको शायद एक एपीआई का पालन करने की आवश्यकता होगी। आप कह सकते हैं कि एक वर्ग की ज़िम्मेदारी खुद को बाहरी प्रारूप में परिवर्तित कर रही है, और उस प्रारूप को वापस पढ़ने में है। – Ewout

+0

जैसा कि मैंने उपरोक्त डेव के जवाब में कहा था, मुझे नहीं लगता कि आपको इन वर्गों को क्रमबद्ध करने के लिए रूबी को क्यों बताना है (धारणाओं का उपयोग करना ऊपर)। उन्हें वास्तव में एक वस्तु के प्रत्येक उदाहरण के माध्यम से जाने के लिए एक पुनरावर्ती विधि है, जब तक कि वे किसी अन्य वस्तु तक नहीं पहुंच जाते हैं, फिर पेड़ में आगे जाते हैं, मुझे यकीन है कि सभी वस्तुएं अंत में सरल प्रकार के मॉडल के रूप में समाप्त होती हैं। एकमात्र बार जब मैं उपयोगकर्ता को किसी भी धारावाहिक तर्क को इनपुट करने की आवश्यकता महसूस कर सकता हूं तो वह है कि यदि वे चाबियों का नाम बदलना चाहते हैं, यानी attr_accessor: उपनाम को अंतिम नाम या समान कुछ के लिए क्रमबद्ध किया जाना है। – Grofit

1

JSON और YAML के लिए यह, बहुत आसान लगता है क्योंकि वे केवल to_yaml और to_json तरीकों के लिए रैपर (या YAML.load और from_json क्रमशः)

होगा JSON के लिए आप के आसपास कोर-प्रकार खुद कक्षाएं रैप करने के लिए होता है (या अन्य प्रकार जो to_json को लागू करते हैं) उदाहरण के लिए पहले एक to_hash विधि को कार्यान्वित करें जिसे फिर जेसन में परिवर्तित किया जा सकता है।

एक्सएमएल पदानुक्रम-पहलू की वजह से और अधिक जटिल है, तो आप इसे मानकीकृत करने के लिए, होगा, लेकिन वास्तव में मैं अपने स्पष्टीकरण क्या बुनियादी to_... तरीकों के साथ गलत है से समझ में नहीं आता। यह वास्तव में सम्मेलन है जिसे हम रूबी में उपयोग करते हैं। यदि आप मॉडलों के प्रदूषण से चिंतित हैं, तो आप इन विधियों को मॉड्यूल में डाल सकते हैं, और कक्षा में मॉड्यूल शामिल कर सकते हैं।

module Foo 
    def to_serialized_type 
    ... 
    end 
end 
class CleanClass 
    include Foo 
end 
+0

जब आप अपनी खुद की कक्षाओं में से किसी एक के उदाहरण के साथ toxxxx का उपयोग करने का प्रयास कर रहे हैं तो आपको अपनी कक्षा के भीतर एक to_xxxx विधि लिखनी होगी ताकि यह बताने के लिए कि धारावाहिक कैसे करें (जो मैंने वर्तमान में पढ़ा है, या यह बाहर आता है {कुछ: blah} के बजाय # <9135f3> की तरह)। यही वह समस्या है जिसे मैं धारावाहिक चिंताओं के साथ मॉडल को प्रदूषित नहीं करना चाहता हूं। – Grofit

+0

मैं इसे प्रदूषण नहीं कहूंगा, क्योंकि यह सामान्य रूप से रूबी में काम करने का तरीका है: सीधे – robustus

1

अपने जादू क्रमबद्धता विधि गंदा आप के लिए वस्तु है; प्रति-वस्तु आधार पर emdirtering हो सकता है।

या अपने वर्ग स्तर पर गंदे।

किसी भी तरह से, आपका मुख्य कोड कोड इसे नहीं देखता है।

+0

क्या आप अधिक विस्तृत कर सकते हैं, मुझे पता है कि आप घोषणा के बाद कक्षाओं में जोड़ सकते हैं, जो शायद आपका मतलब है।हालांकि, अगर मैंने उस वर्ग के बाहर कुछ कोड लिखा है, यह बताने के लिए कि इसे कैसे क्रमबद्ध किया जाए, तो मुझे अपने प्रोजेक्ट के भीतर और अधिक कोड रखना होगा, और प्रति वर्ग प्रकार लिखा जाना होगा। यानी यदि किसी व्यक्ति वर्ग का पहला नाम और उपनाम है, तो एक बिजनेस क्लास का नाम, पता फ़ील्ड होता है, तो आपको जटिल ऑब्जेक्ट ग्राफ के साथ, उनसे निपटने के लिए क्रमबद्ध तर्क के 2 अलग-अलग बिट लिखने की आवश्यकता होगी, यह असंभव हो जाएगा। – Grofit

+0

मौजूदा धारावाहिक कोड को कम से कम सरल गुणों के लिए किसी ऑब्जेक्ट को लिखना नहीं बताया जाता है, यह ऑब्जेक्ट से पूछताछ करता है। यदि आपके पास जटिल क्रमिकरण की आवश्यकता है तो आपको यह बताना होगा कि कैसे/कहीं /। आप मूल रूप से दो चीजों के लिए पूछ रहे हैं: मैं अपनी कक्षा को क्रमबद्ध करने के तरीके पर पूर्ण नियंत्रण चाहता हूं, लेकिन मुझे अपनी कक्षा में वह जानकारी नहीं चाहिए, और मैं इसे स्वचालित रूप से संभालना चाहता हूं। यह इस तरह काम नहीं करता है-आपको यह परिभाषित करने की आवश्यकता है कि इसे क्रमबद्ध/कहीं/कैसे किया जाएगा। –

+0

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

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

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