2009-05-07 21 views
12

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

क्या मुझे गुण, संग्रह इत्यादि लिखने के लिए सभी कोड लिखना होगा?

+0

अच्छा प्रश्न, क्या आप इस मुद्दे की प्रदर्शन आवश्यकताओं और पैमाने पर विस्तार से विस्तार कर सकते हैं। –

+0

इस बिंदु पर, मुझे वास्तव में कोई आवश्यकता नहीं है। मैं सबसे खूबसूरत समाधान की तलाश में हूं। – Martin

+1

आप वास्तव में शून्य-आवश्यकता की समस्या के समाधान का समाधान नहीं कर सकते हैं :) इससे कोई फर्क नहीं पड़ता कि आप किस समाधान को चुनते हैं, यह गलत समाधान होने की संभावना है। अगर कोई आवश्यकता नहीं है तो इसका उत्तर देने का कोई तरीका नहीं है ... –

उत्तर

9

जावास्क्रिप्टसेरियलाइज़र का उपयोग करें। यह System.Web.Script.Serialization नामस्थान में है और System.Web.Extensions.dll असेंबली में 3.5 ढांचे में कार्यान्वित किया गया है।

इस कक्षा के साथ, आप किसी भी पॉको को क्रमबद्ध कर सकते हैं चाहे इसे [Serializable] के रूप में चिह्नित किया गया हो या नहीं। JSON क्रमबद्धता का उपयोग करने के लिए आपके प्रोग्राम को वेब एप्लिकेशन नहीं होना चाहिए।यहां एक उदाहरण दिया गया है:

public class Unserializable 
{ 
    public int Age { get; set; } 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class Program 
{ 
    static void Main() 
    { 
    var u = new Unserializable 
      { 
       Age = 40, 
       ID = 2, 
       Name = "Betty" 
      }; 
    var jser = new JavaScriptSerializer(); 
    var jsonText = jser.Serialize(u); 
    // next line outputs {"Age":40,"ID":2,"Name":"Betty"} 
    Console.WriteLine(jsonText); 
    } 
} 
+0

+1 क्योंकि मुझे यह नहीं पता था। क्या यह फ़ील्ड भी संभालता है? –

+0

हां, यह फ़ील्ड को भी संभालता है। इसे आज़माएं: सार्वजनिक वर्ग Unserializable { सार्वजनिक int आयु; सार्वजनिक int आईडी {प्राप्त करें; सेट; } सार्वजनिक स्ट्रिंग नाम {प्राप्त करें; सेट; } सार्वजनिक Unserializable (int आयु, int आईडी, स्ट्रिंग नाम) { आयु = आयु; आईडी = आईडी; नाम = नाम; } } var u = new unserializable (40, 2, "डोना"); var jser = new JavaScriptSerializer(); var jsonText = jser.Serialize (u); कंसोल। राइटलाइन ("सीरियलाइज्ड {0}" + "जावास्क्रिप्टसेरलाइज़र का उपयोग {1}:", u.GetType()। नाम, jsonText); यह सार्वजनिक क्षेत्र वाले ऑब्जेक्ट के लिए JSON टेक्स्ट को '{"आयु": 40, "आईडी": 2, "नाम": "डोना"} के रूप में आउटपुट करता है। –

0

मैं एक कोड जनरल उपकरण (mygeneration, टी -4, जो कुछ भी) उत्पन्न करने के लिए DTOs serialise करने के लिए प्रयोग करेंगे ...

+0

इस कोड से बाहर निकलने वाले कोड के साथ समस्या यह है कि यदि कक्षा में परिवर्तन होता है तो आपको फिर से जेन कोड करना होगा। यह एक समस्या हो सकती है या नहीं भी हो सकती है। –

+0

मुझे इस कारण को कोई कारण नहीं दिख रहा है ... –

0

नहीं एक सरल समाधान का।

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

आपको प्रतिबिंब का उपयोग करके एक धारावाहिक वस्तु को deserialize करने के बारे में कुछ बड़े अनुमान लगाना होगा। मुझे यह मानना ​​है कि उन वस्तुओं के कुछ क्षेत्रों में अन्य वस्तुओं के संदर्भ शामिल हैं, और आपको यह जानना होगा कि उन सभी को कैसे पार करना है।

इसके अतिरिक्त, आपको पैरामीटरयुक्त कन्स्ट्रक्टर को कॉल करना होगा और उम्मीद है कि प्रतिबिंब के साथ फ़ील्ड सेट करते समय आप बहुत अधिक नुकसान नहीं कर रहे हैं।

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

उस ने कहा, कोड जेन कक्षाओं के सभी क्षेत्रों की पहचान करने के कार्य को सरल बनाने में सक्षम हो सकता है।

0

एक और विकल्प एडाप्टर पैटर्न का उपयोग करना है।

अच्छी खबर यह है कि आपको मूल वर्ग को बदलना नहीं होगा। बुरी खबर यह है कि आप शायद पहले "अपरिवर्तनीय" वर्ग में मौजूद दो गुना कोड के रूप में लिखना समाप्त कर देंगे।

आप 2 नए वर्गों के साथ समाप्त होंगे: एडाप्टर, और नई धारावाहिक कक्षा।

यह विचार यह है कि एडाप्टर जानता है कि कैसे अनावश्यक वर्ग की जांच करके serizliable वर्ग बनाने के लिए। दूसरी तरफ जाने के लिए (अनुक्रमिक करने के लिए serializable) आप फिर से एक एडाप्टर का उपयोग कर सकते हैं (बेशक, यहां मैं मान रहा हूं कि आपके निजी सेटर्स वास्तव में पैरामीटरयुक्त कन्स्ट्रक्टर के माध्यम से सेट हैं)।

Here's the pattern in detail.

0

इस के लिए दो अलग-अलग भागों हैं:

  1. निकालने/
  2. भंडारण/फ़ाइल (या अन्य स्थान) से इसे पढ़ने

के लिए डेटा सेट करने पहला भाग, यदि आप उन कक्षाओं को नहीं बदल सकते हैं जिन्हें आप क्रमबद्ध/deserialize करना चाहते हैं, तो आप वास्तव में प्रतिबिंब के माध्यम से एक गहरी प्रतिलिपि करने के साथ छोड़ दिए गए हैं।

क्रमबद्ध करने के लिए, कक्षा के प्रत्येक सदस्य के मूल्य को संग्रहीत करने के माध्यम से जाएं।

उदाहरण के लिए एक्सएमएल, और इन मानों को डिस्क पर लिखने के लिए आप जिस भी माध्यम को स्टोर करना चाहते हैं उसका उपयोग करें।

deserialization के लिए, फ़ाइल से मूल्यों में पढ़ें, ऑब्जेक्ट का एक नया उदाहरण बनाएं और सभी मानों को सेट करने के लिए प्रतिबिंब का उपयोग करें।

यदि आप सभी सदस्यों को प्राप्त/सेट करते हैं तो आपके पास एक ऐसी स्थिति होगी जो एक समान स्थिति में हो। (यदि आपके पास जटिल सदस्य हैं तो आपको अपने सभी ऑब्जेक्ट्स के माध्यम से फिर से जाना पड़ सकता है।)

डिस्क, एक्सएमएल या बाइनरी दोनों पर डेटा को स्टोर करने के तरीके के रूप में। यदि आप इसे देखना चाहते हैं और यह मानव पठनीय है, तो एक्सएमएल के साथ जाओ। (मैं इसे आपके प्रारंभिक स्टैब के लिए अनुशंसा करता हूं क्योंकि यह डिबगिंग को अधिक आसान बना देगा।)

7

के लिए नौकरी की तरह लगता है ... serialization surrogates!

एक सिंहावलोकन के लिए http://msdn.microsoft.com/en-us/magazine/cc188950.aspx

पर जाएं।

+0

+1: सरोगेट्स बाइनरीफॉर्मेटर के साथ अच्छा खेलेंगे। –

+0

लिंक मृत, यहां संग्रह करें: https://web.archive.org/web/20141231105711/http://msdn.microsoft.com/en-us/magazine/cc188950.aspx, या MSDN: https: // msdn। microsoft.com/en-us/library/system.runtime.serialization.surrogateselector(v=vs.110).aspx –

0

यह वास्तव में आपकी समस्या के पैमाने और आपके प्रदर्शन की आवश्यकता पर निर्भर करता है।

यदि आपके पास 1 समस्या वर्ग है, तो मैं केवल एक सरोगेट क्लास लिखूंगा जो उस वर्ग को क्रमबद्ध/deserialize कर सकता है। यदि आप 100 वर्गों के बारे में बात कर रहे हैं तो आपको शायद सभी जटिलताओं का समर्थन करने वाले एक क्रमबद्ध ढांचे का उपयोग करने की आवश्यकता है। कोई पैरामीटर रहित निर्माण एक दुःस्वप्न नहीं है, जो भी धारावाहिक ढांचा आप लिखते हैं या उपयोग करते हैं, आपको कन्स्ट्रक्टर को पास करने के लिए पैरा को आगे बढ़ाना होगा। निजी सेटर्स/शब्दकोश/सूचियां इत्यादि बहुत अधिक समस्या नहीं हैं।

मैंने मीडिया ब्राउज़र के लिए mini-serialization ढांचा लिखा जो बीएसडी है। मेरा ध्यान प्रदर्शन पर था, लेकिन मेरे द्वारा उपयोग की जाने वाली तकनीकों को आपकी समस्या के अनुकूल बनाया जा सकता है। इसी प्रकार मार्क के protocol buffers में उपयोग की जाने वाली तकनीकों का उपयोग किया जा सकता है।

यदि प्रदर्शन बिल्कुल महत्वपूर्ण नहीं है, तो काफी मामूली धारावाहिक ढांचे को काफी तेज़ी से कोड किया जा सकता है जो प्रतिबिंब का उपयोग करता है, जब आप चीज को निष्पादित रखने की कोशिश करते हैं तो सामान कठिन हो जाता है।

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