पर PHP ऑब्जेक्ट-ग्राफ़ को सीरियलाइज़/अनैरियलाइज़ करें, मैं एक JSON स्ट्रिंग प्रस्तुति के लिए एक पूर्ण PHP ऑब्जेक्ट-ग्राफ़ को क्रमबद्ध करना चाहता था, और उसे एक समान PHP ऑब्जेक्ट-ग्राफ़ पर बेअसर करना चाहता था।जेएसओएन
विकल्प यहां मैं माना जाता का सार है, और कारण वे मेरे लिए काम नहीं करते:,
serialize()
जो मैं चाहता भी नहीं करता है, क्योंकि यह एक प्रारूप पीएचपी के लिए विशिष्ट उपयोग करता है। मैं एक प्रारूप चाहता हूं जो व्यापक रूप से अधिकांश भाषाओं, और मानव-पठनीय/संपादन योग्य द्वारा समर्थित है।json_encode()
जो मैं चाहता हूं वह नहीं करता है, क्योंकि यह केवल सरल मूल्यों और सरणी करता है, वस्तुओं नहीं। (मैं वास्तव में मेरी कार्यान्वयन में इस का उपयोग कर रहा है, नीचे देखें।)var_export()
वृत्तीय संदर्भ संभाल नहीं करता है और जो मैं चाहता भी नहीं करता है (ऊपर देखें।) (ध्यान दें मेरे वर्तमान कार्यान्वयन नहीं है कि संभाल वृत्तीय संदर्भ या तो - टिप्पणियों को देखने और इस मुद्दे के स्पष्टीकरण के लिए नीचे दिए गए उत्तर)सेबस्टियन बर्गमैन के Object Freezer एक अच्छा कार्यान्वयन है, लेकिन यह मैं क्या चाहते हैं नहीं करता है या तो -। यह एक बहुत लंबे प्रपत्र का उपयोग करता है, और GUIDs के साथ धारावाहिक वस्तुओं को भरने पर निर्भर करता है।
Serialized जो भी मैं चाहता हूं वह नहीं करता है - यह वास्तव में धारावाहिकता नहीं करता है, यह
serialize()
के आउटपुट को पार करता है और एक अलग प्रतिनिधित्व प्रस्तुत करता है, उदा। एक्सएमएल, लेकिन उस प्रतिनिधित्व को पार्स करने में असमर्थ है। (यह भी JSON का समर्थन नहीं करता - एक्सएमएल बहुत लंबे रूप है, और जो मैं चाहता नहीं है।)
मैं अब साझा करने के लिए एक काम कार्यान्वयन है:
https://github.com/mindplay-dk/jsonfreeze
JSON- , वृत्तीय संदर्भ की अनुमति नहीं है और न ही कई r -
{
"#type": "Order",
"orderNo": 123,
"lines": [{
"#type": "OrderLine",
"item": "milk \"fuzz\"",
"amount": 3,
"options": null
}, {
"#type": "OrderLine",
"item": "cookies",
"amount": 7,
"options": {
"#type": "#hash",
"flavor": "chocolate",
"weight": "1\/2 lb"
}
}],
"paid": true
}
यह दृष्टिकोण एक शुद्ध पेड़ संरचना कुल के लिए काम करने के लिए बनाया गया है: वस्तु ग्राफ का प्रतिनिधित्व इस तरह दिखता है एक ही वस्तुओं के लिए संदर्भ। दूसरे शब्दों में, यह सामान्य उद्देश्य नहीं है जैसे उदा। serialize()
और unserialize()
जो किसी भी PHP ऑब्जेक्ट-ग्राफ के लिए काम करता है।
मेरे initial approach में मैंने एक धारावाहिक रूप का उपयोग किया जो अनिवार्य रूप से वस्तुओं की आधार -0 सूची थी। सूची में पहला ऑब्जेक्ट (संख्या 0) धारावाहिक ऑब्जेक्ट-ग्राफ़ की जड़ है, किसी भी अन्य ऑब्जेक्ट को उनके क्रम में संग्रहीत किया जाता है।
वर्तमान कार्यान्वयन में, जेएसओएन प्रतिनिधित्व मूल वृक्ष-संरचना जैसा दिखता है, यह संभव है कि यह संभव है, जिससे जावास्क्रिप्ट में ऑब्जेक्ट-ग्राफ़ के जेएसओएन प्रस्तुति के साथ वास्तव में काम करना संभव हो। (JSON के रूप में जमा केवल विचलन जादू #type
संपत्ति और #hash
"प्रकार", (JSON ऑब्जेक्ट के रूप में जमा) नियमित array
प्रकार सरणियों से array
प्रकार हैश भेद करने के लिए इस्तेमाल किया (संपत्ति-नाम के साथ टकराव को रोकने के लिए # उपसर्ग के साथ) है सरणियों)।
मैं ऐतिहासिक उद्देश्यों के लिए यहां पिछले संस्करण के बारे में इन नोट्स को छोड़ रहा हूं।
सर्कुलर संदर्भों को प्रत्येक ऑब्जेक्ट के क्रमबद्ध प्रतिनिधित्व के अंदर नेस्टेड ऑब्जेक्ट्स को कभी भी संग्रहीत नहीं किया जाता है - इसके बजाय, किसी ऑब्जेक्ट-रेफरेंस को ऑब्जेक्ट-इंडेक्स के साथ JSON-ऑब्जेक्ट के रूप में संग्रहीत किया जाता है - उदा। {"__oref":2}
ऑब्जेक्ट-सूची में इंडेक्स 2
के साथ ऑब्जेक्ट का संदर्भ है।
मुझे अपने कार्यान्वयन में सरणी-संदर्भों में समस्या है - जब मैं var_dump() कोड के अंदर जो सरणी के ऑब्जेक्ट्स के संदर्भों को पुनर्स्थापित करता है, तो उन्हें पॉप्युलेट किया जा रहा है, लेकिन किसी बिंदु पर सरणी की प्रतिलिपि बनाई जाती है, और आप खाली प्रति के साथ खत्म हो जाते हैं। मैंने कोड में हर जगह &
वर्ण रखने की कोशिश की है, लेकिन जहां भी मैं संदर्भ द्वारा पास करता हूं, अंत परिणाम एक खाली सरणी है।
मैं PHP स्वामित्व के क्रमबद्ध प्रारूप को कॉल नहीं करता क्योंकि यह दस्तावेज है - [कम से कम स्रोत-कोड के अंदर] (http://lxr.php.net/opengrok /xref/PHP_TRUNK/ext/standard/var.c#php_var_serialize_intern) - लेकिन साथ ही साथ तृतीय पक्ष भी। तो आप इसका इस्तेमाल कर सकते हैं। – hakre
इसे दस्तावेज किया जा सकता है, लेकिन PHP एकमात्र प्लेटफ़ॉर्म/भाषा है जिसमें अनसुलझा() - का कार्यान्वयन है - मैं JSON को प्राथमिकता दूंगा जो पहले से ही प्रत्येक मुख्यधारा भाषा द्वारा समर्थित है। और मानव-पठनीय भी है। –
आप धारावाहिक डेटा को एक्सएमएल में परिवर्तित कर सकते हैं जो हर जगह समर्थित है। [सीरियलाइज्ड लाइब्रेरी] (https://github.com/ktomk/Serialized) यह करता है। इसे जेसन डम्पर बीटीडब्ल्यू के साथ विस्तारित करना मुश्किल नहीं होना चाहिए। - तो शायद आप इसे उपयोगी पाते हैं। – hakre