2009-09-14 11 views
8

मैं सबसे सुविधाजनक तरीके से सी ++ structs का एक समूह क्रमबद्ध करने का एक तरीका ढूंढ रहा हूं ताकि सीरियलाइजेशन सी ++ और जावा (न्यूनतम पर) और 32 बिट/64 बिट, बड़े/छोटे एंडियन प्लेटफॉर्म। धारावाहिक होने वाली संरचनाओं में केवल डेटा होता है, यानी वे शुद्ध डेटा ऑब्जेक्ट्स हैं जिनमें कोई राज्य या व्यवहार नहीं है।क्रॉस-प्लेटफ़ॉर्म और भाषा (डी) क्रमबद्धता

विचार यह है कि हम structs को एक ऑक्टेट ब्लॉब में क्रमबद्ध करते हैं जिसे हम "सामान्य रूप से" डेटाबेस में स्टोर कर सकते हैं और बाद में पढ़ सकते हैं। इस प्रकार जब भी कोई संरचना बदलती है और डेटाबेस में प्रत्येक डेटा सदस्य को असाइन करने से बचने से डेटाबेस को बदलना टाल जाता है - यानी हम केवल एक टेबल को बाइनरी ब्लॉब के रूप में "सामान्य रूप से" सबकुछ पकड़ना चाहते हैं। इससे डेवलपर्स के लिए कम काम करना चाहिए और संरचनाओं में बदलाव होने पर कम परिवर्तन की आवश्यकता होनी चाहिए।

मैंने boost.serialize पर देखा है लेकिन ऐसा नहीं लगता कि जावा के साथ संगतता सक्षम करने का एक तरीका है। और इसी तरह जावा में Serializable विरासत के लिए।

यदि आईडीएल फ़ाइल से शुरू करके ऐसा करने का कोई तरीका है जो सबसे अच्छा होगा क्योंकि हमारे पास पहले से ही आईडीएल फाइलें हैं जो संरचनाओं का वर्णन करती हैं।

अग्रिम में चीयर्स!

+1

http://msgpack.org/ पर देखें यह क्रॉस-प्लेटफ़ॉर्म और बहु ​​भाषा है। –

उत्तर

1

आपने एक्सएमएल क्यों नहीं चुना है, क्योंकि यह आपकी मांग के अनुरूप है। सी ++ और जावा दोनों एक आसान कार्यान्वयन के लिए अनुमति देते हैं।

इसके अलावा, मैं डेटाबेस में एक ब्लॉब के रूप में सब कुछ भंडारण के अपने विचार पर शक, एक संबंधपरक डेटाबेस क्या एक डेटाबेस के लिए डिजाइन किया गया है का उपयोग करें, या http://www.versant.com/en_US/products/objectdatabase जो दोनों जावा और सी ++ का समर्थन करता है जैसे कुछ वस्तु उन्मुख डेटाबेस पर स्विच करें। गुजर संरचित डेटा पार भाषा -

+1

एक्सएमएल और अन्य मानव पठनीय प्रारूप वास्तव में एक विकल्प नहीं हैं जो ओवरहेड की मात्रा के कारण होगा। वर्तमान में हम एक दिन में एक डिस्क में 1TB कच्चे डेटा को संग्रहीत करने पर विचार कर रहे हैं। एक्सएमएल के महत्वपूर्ण ओवरहेड का मतलब यह होगा कि हम जितना कच्चे डेटा की जरूरत है उतना कच्चे डेटा को स्टोर नहीं कर सकते हैं। – fwgx

6

मैं हैरान जॉन स्कीट पहले से ही इस एक :-)

Protocol Buffers काफी परिदृश्य की इस तरह के लिए डिज़ाइन किया गया है पर pounced नहीं किया हूँ।

यह कहा गया है कि, यदि आप डेटाबेस का उपयोग करने के तरीके का उपयोग कर रहे हैं, तो आपको वास्तव में ओरेकल या एसक्यूएल सर्वर जैसे पूर्ण-शक्ति आरडीबीएमएस का उपयोग नहीं करना चाहिए बल्कि बर्कले डीबी या एक हल्के कुंजी-मूल्य स्टोर का उपयोग नहीं करना चाहिए कई "क्लाउड टेबल" इंजनों में से।

1

आपको ASN.1 की आवश्यकता है! (कुछ लोग इसे बाइनरी एक्सएमएल के रूप में संदर्भित करते हैं।) एएसएन .1 बहुत कॉम्पैक्ट है और इस प्रकार दो प्रणालियों के बीच डेटा स्थानांतरित करने के लिए आदर्श है। और उन लोगों के लिए जो यह नहीं सोचते कि इसका कभी भी उपयोग किया जाता है: कई इंटरनेट प्रोटोकॉल डेटा क्रमिकरण के लिए ASN.1 मॉडल पर आधारित होते हैं!

दुर्भाग्यवश, जावा या सी ++ के लिए कई पुस्तकालय उपलब्ध नहीं हैं जो ASN.1 का समर्थन करेंगे। मुझे कई साल पहले इसके साथ काम करना पड़ा और सी ++ में एएसएन .1 के समर्थन की अनुमति देने के लिए बस एक अच्छा, मुफ्त या सस्ता टूल नहीं मिला। Objective Systems पर वे एएसएन .1/एक्सएमएल समाधान बेच रहे हैं लेकिन यह बेहद महंगा है। (सी ++ और जावा के लिए ASN.1 compiler, वह है!) यह आपको कम से कम एक हाथ और एक पैर खर्च करता है! (लेकिन फिर आपके पास एक उपकरण होगा जिसका उपयोग आप केवल एक हाथ से कर सकते हैं ...)

+0

अच्छा सुझाव, लेकिन इस परियोजना पर कुछ महंगा नहीं है। मैं इसे ध्यान में रखूंगा हालांकि :) – fwgx

6

यदि मैं वास्तव में वास्तव में क्रॉस भाषा जाना चाहता हूं, तो मैं सामान्य रूप से जेएसओएन का सुझाव दूंगा, जावास्क्रिप्ट समर्थन की आसानी और abundance of libraries, साथ ही मानव पठनीय और संशोधित होने के नाते (मैं इसे एक्सएमएल को पसंद करता हूं क्योंकि मुझे इसे वर्णों, तेज़ और अधिक पठनीय के मामले में छोटा लगता है)। यह अंतरिक्ष के मामले में सबसे कुशल नहीं है, हालांकि, protocol buffers या thrift जैसे अधिक मशीन पठनीय प्रारूप में फायदे होंगे (आईडीएल से थ्रिफ्ट किया जा सकता है, लेकिन यह एन्कोडिंग सेवाओं के लिए भी बनाया जाता है, इसलिए यह भारी हो सकता है तुम्हें चाहिए)।

1

मैं SQLite डेटाबेस के साथ डेटा को सहेजने का सुझाव दूंगा।Structs SQLite तालिकाओं में डेटाबेस पंक्तियों के रूप में संग्रहीत किया जा सकता है।

परिणामस्वरूप डेटाबेस फ़ाइल कई अलग-अलग प्लेटफार्मों में बाइनरी संगत है और आपके मुख्य डेटाबेस में बीएलओबी के रूप में संग्रहीत की जा सकती है। मेरा मानना ​​है कि फ़ाइल का आकार एक ही डेटा के साथ संपीड़ित एक्सएमएल फ़ाइल के बराबर है, लेकिन प्रोसेसिंग के दौरान मेमोरी उपयोग एक्सएमएल डोम से काफी कम होगा।

0

एवरो भी है। अपाचे थ्रिफ्ट, प्रोटोकॉल बफर, एमईएस आदि की तुलना के लिए this प्रश्न देखें।

3

मैं यहां एक बहुत ही समान प्रश्न रखने के कारण ठोकर खाई। 6 साल बाद, यह आपके लिए उपयोगी नहीं हो सकता है, लेकिन उम्मीद है कि यह दूसरों के लिए होगा।

वहाँ, (हालांकि एक बहस कर सकते कि JSON स्पष्ट विजेता है) विकल्प के एक बहुत हैं दुर्भाग्य से कोई स्पष्ट विजेता। यहां तक ​​कि गूगल जारी किया है कई प्रतिस्पर्धा प्रौद्योगिकियों (उन सभी को जाहिरा तौर पर आंतरिक रूप से इस्तेमाल किया जा रहा):

  • FlatBuffers: यह एक मूल प्रश्न, has interesting benchmarks और supports some form of IDL (मैं व्यक्तिगत रूप से नहीं परिचित आईडीएल के साथ हूँ) से आवश्यकताओं को पूरा करने लगता है
  • Protocol Buffers: पहले उल्लेख किया गया है।
  • XFJSON: जेएसओएन से 5% -12% छोटा।

नहीं विकल्प अन्य उत्तर में तैनात भूल जाते हैं।

  • YAML: JSON शून्य से सभी डबल कोट, लेकिन इसके बजाय खरोज का उपयोग कर ये कुछ और कर रहे हैं। यह अधिक मानव पठनीय है, लेकिन शायद कम कुशल है, खासकर जब यह बड़ा हो जाता है।
  • BSON (बाइनरी JSON)
  • MessagePack (एक और ठोस JSON)
तो कई रूपों के साथ

, JSON स्पष्ट रूप से सादगी/सुविधा और पार मंच का उपयोग करने के मामले में विजेता है। जावास्क्रिप्ट के उदय के साथ, पिछले कुछ सालों में इसने और भी लोकप्रियता हासिल की है। बहुत से लोग शायद इसे एक वास्तविक तथ्य के रूप में उपयोग करते हैं, बिना किसी विचार के (यह वही है जो मैंने मूल रूप से किया था: पी)।

हालांकि, यदि आकार एक मुद्दा बन जाता है, लेकिन आप चीजों को सरल रखना पसंद करते हैं और अधिक उन्नत पुस्तकालयों में से एक का उपयोग नहीं करते हैं, तो आप zlib (जो मैं अब कर रहा हूं) का उपयोग कर JSON को संकुचित कर सकता हूं, या कुछ अन्य क्रॉस प्लेटफार्म एल्गोरिदम (लेकिन यह एक अन्य विषय है)।

JSON सी ++ में से निपटने में तेजी लाने के लिए, आप भी RapidJSON इस्तेमाल कर सकते हैं।

+0

ध्यान दें कि संपीड़न आपको स्थान और बैंडविड्थ बचाएगा, [लेकिन प्रदर्शन के संदर्भ में आपको खर्च आएगा] (http://www.cowtowncoder.com/blog/archives/2009/05/ entry_263.html)। –

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