2009-03-14 22 views
5

AMF3 specification तथाकथित "संदर्भ तालिका" के उपयोग को परिभाषित करता है (इस विनिर्देश के अनुभाग 2.2 देखें)।फ्लैश: संदर्भ तालिका के साथ AMF3?

मैंने अपने एएमएफ 3 एन्कोडर/डीकोडर में इस व्यवहार को एर्लांग में विकसित किया है, लेकिन फ्लैश एपीआई के साथ बहुत अनुभवी नहीं होने के कारण, मुझे शायद ही पता चलेगा कि मैं एएमएफ 3 पर ऑब्जेक्ट्स को क्रमबद्ध करते समय फ्लैश को इन संदर्भ सारणी का उपयोग करने के लिए आसानी से कैसे मजबूर कर सकता हूं; उदाहरण के लिए अगर मैं bytearray उपयोग करते हैं, ऐसा लगता है कि यह सिर्फ पूर्ण वस्तु एनकोडिंग

var ba:ByteArray = new ByteArray(); 
ba.writeObject("some string1"); 
ba.writeObject("some string1"); 
# => 
# <<6,25,115,111,109,101,32,115,116,114,105,110,103,49, 
# 6,25,115,111,109,101,32,115,116,114,105,110,103,49>> 

दोहराता है (जो स्पष्ट रूप से एक पुनरावृत्ति है)।

हालांकि, अगर इन दो तार एक एक एकल writeObject कॉल में हैं, यह संदर्भ का उपयोग प्रतीत होता है:

ba.writeObject(["some string1", "some string1"]); 
# => <<9,5,1,6,25,115,111,109,101,32,115,116,114,105,110,103,49,6,0>> 

सॉकेट ही तरह से व्यवहार करने लगता है।

तो, क्या मैं फ्लैश कोड में संदर्भ तालिकाओं का उपयोग कर सकता हूं? (बशर्ते मैं में फ़्लैश एप्लिकेशन और सर्वर के बीच एक गैर मानक प्रोटोकॉल हो)

धन्यवाद!

उत्तर

3

मुझे लगता है कि अंतर यह है कि पहले उदाहरण में आप दो स्ट्रिंग अक्षर लिख रहे हैं। दूसरे उदाहरण में आप एक सरणी (या एडोब के चश्मे में कॉम्प्लेक्स ऑब्जेक्ट) लिख रहे हैं जिसमें दो तारों का संदर्भ है। तो यदि आप किसी ऑब्जेक्ट या सरणी से स्ट्रिंग का संदर्भ देते हैं तो यह इसे संदर्भ तालिका में लिख देगा।

यह आवश्यक रूप से इसे लागू करने का एक तरीका नहीं है, लेकिन यह तार्किक लगता है कि फ्लैश में निर्मित एएमएफ सीरियलाइज़र इस तरह से वस्तुओं को क्रमबद्ध करेगा ताकि यह संभवतः व्यवहार (संदर्भ तालिका तार) प्राप्त करने का एक विश्वसनीय तरीका हो।

मुझे उम्मीद है कि यह आपके लिए उपयोगी है!

+0

मैंने सोचा कि प्रति कनेक्शन संदर्भ तालिकाओं को बनाए रखने के लिए एक तंत्र होगा ... कम से कम यही है कि मैं उनके एएमएफ 3 spec से समझ गया ... श्वास। –

+0

लेकिन वैसे भी धन्यवाद! –

0

आधिकारिक AMF3 spec के अंतिम पृष्ठ को देखें और आप देखेंगे कि बाइटएरे बहुत सुंदर है। आपको अपना स्वयं का एएमएफ 3 धारावाहिक/deserializer लिखना होगा।

1

AMF3 विनिर्देश (AMF 3.0 Spec at Adobe.com) के अंतिम वाक्य के अनुसार:

भी ध्यान रखें कि bytearray वस्तुओं के लिए अंतर्निहित संदर्भ तालिकाओं का एक नया सेट का उपयोग करता है, प्रत्येक readObject और writeObject कॉल के लिए लक्षण और तार आपत्ति है।

ऐसा प्रतीत होता है कि ByteArray.writeObject के साथ इरादा एक क्रमबद्धता बनाना है जिसे प्रति-ऑब्जेक्ट आधार पर संग्रहीत या पुनर्प्राप्त किया जा सकता है।

नेटकनेक्शन ऑब्जेक्ट का व्यवहार वही है जो आपने आशा की थी।

स्ट्रिंग-संदर्भ तालिका को अद्यतन करते समय, संदर्भ तालिका में खाली तार नहीं जोड़ना महत्वपूर्ण है।

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

स्ट्रिंग-रेफरेंस टेबल एन्कोडर पर 'टैगिंग' इन-मेमोरी स्ट्रिंग ऑब्जेक्ट्स द्वारा क्रमबद्ध किया जाता है क्योंकि वे क्रमबद्ध होते हैं। एक ही सामग्री (मिलान तारों) के साथ दो अलग-अलग स्ट्रिंग ऑब्जेक्ट्स एन्कोडिंग को दूसरे संदर्भ में एक स्ट्रिंग के साथ एन्कोड नहीं किया जाता है। दोनों तार आउटपुट होंगे और स्ट्रिंग-बाय-रेफरेंस का उपयोग नहीं किया जाएगा।

आपके मूल प्रश्न का समाधान हो सकता है। यदि आपके पास एक ही कक्षा से संबंधित सभी ऑब्जेक्ट्स हैं, और आप उन ऑब्जेक्ट्स को एक ही स्टोरेज में स्टोर करना चाहते हैं, तो मैं निम्न का सुझाव देता हूं: उन सभी ऑब्जेक्ट्स के संदर्भ में "पैरेंट ऑब्जेक्ट" बनाएं जिन्हें आप स्टोर करना चाहते हैं। फिर उस मूल वस्तु को बनाए रखने के लिए ByteArray.writeObject का उपयोग करें। एएमएफ सभी संदर्भित वस्तुओं को एन्कोड करेगा और एक कुशल तरीके से बार-बार ऑब्जेक्ट कक्षाओं के गुणों का प्रतिनिधित्व करेगा।