2008-09-20 6 views
30

मैं पूरे वर्ग ग्राफ के बारे में चिंता किए बिना वस्तुओं को क्रमबद्ध और deserialize करना चाहता हूँ।.NET ऑब्जेक्ट्स के लिए सबसे लचीला क्रमिकरण क्या है, अभी तक लागू करने के लिए आसान है?

लचीलापन कुंजी है। मैं पूरे ऑब्जेक्ट ग्राफ़ में आवश्यक पूर्ण विशेषताओं के बिना मुझे पास की गई किसी ऑब्जेक्ट को क्रमबद्ध करने में सक्षम होना चाहता हूं।

इसका मतलब है कि बाइनरी क्रमबद्धता एक विकल्प के रूप में यह केवल अन्य नेट प्लेटफार्म के साथ काम करता नहीं है। मैं को व्यक्ति द्वारा कुछ पठनीय करने की तरह कुछ भी पसंद करता हूं, और इस प्रकार प्रबंधन प्रोग्राम और अन्य दुभाषियों द्वारा समझ में आता है।

मुझे डेटाकंट्रैक्ट, JSON, और XML Serializers का उपयोग करने में समस्याएं मिली हैं।

  • इन त्रुटियों के अधिकांश सूचियां/शब्दकोश (अर्थात XML Serializable Generic Dictionary) की क्रमबद्धता के आसपास केंद्रित करने के लिए लग रहे हैं।
  • "- KnownTypeAttribute विशेषता का उपयोग करके या द्वारा उन्हें DataContractSerializer के लिए पारित किया जाना जाता प्रकार की सूची में जोड़ने उदाहरण के लिए, नहीं जाना जाता है प्रकार की सूची को स्थिर में जाना जाता है किसी भी प्रकार जोड़ें।"

कृपया अपने उत्तरों को वास्तविक अनुभवों पर आधारित करें, न कि किसी लेख के सिद्धांत या पढ़ने के लिए।

उत्तर

53

से नकल के रूप में होगा आप JSON के serializing पर विचार किया है एक्सएमएल के बजाय?

Json.NET में वास्तव में शक्तिशाली और लचीला धारावाहिक है जिसमें हैशटेबल/जेनेरिक शब्दकोशों के साथ कोई समस्या नहीं है और किसी विशेष विशेषताओं की आवश्यकता नहीं है। मुझे पता है क्योंकि मैंने इसे लिखा है :)

यह आपको धारावाहिक पर विभिन्न विकल्पों के माध्यम से नियंत्रण की ढेर देता है और यह आपको इसके लिए जेसन कनवर्टर बनाकर एक प्रकार का क्रमबद्ध करने के तरीके को ओवरराइड करने की अनुमति देता है।

मेरी राय में जेएसओएन एक्सएमएल की तुलना में अधिक मानव पठनीय है और जेसन.NET अच्छी तरह से स्वरूपित जेएसओएन लिखने का विकल्प देता है।

अंत में परियोजना ओपन सोर्स है ताकि आप कोड में कदम उठा सकें और यदि आपको आवश्यकता हो तो संशोधन कर सकते हैं।

+0

मैंने यह कोशिश की है, और यह मुझे डेटामैंइनुलेटर जेएसओएन सीरियलाइज़र बॉक्स के बाहर बेहतर त्रुटि परिणाम देता है, हालांकि यह अभी भी लूपिंग संदर्भ के कारण बमबारी है। कोई सुझाव? मैं एक मैसेजिंग फ्रेमवर्क बना रहा हूं और किसी ऑब्जेक्ट की वास्तविक संरचना पर अधिक नियंत्रण नहीं रखता हूं। – mrbradleyt

+1

JsonSerializer पर संदर्भ LoopHandling प्रॉपर्टी को अनदेखा करने के लिए सेट करें। –

+6

मैं JSON.Net का उपयोग करता हूं - यह पूरी तरह से चट्टानों !!!!! –

0

करने के लिए सबसे आसान बात यह है कि अपनी ऑब्जेक्ट्स को सीरियलज़ेबल विशेषता के साथ चिह्नित करें और फिर सीरियलाइजेशन को संभालने के लिए बाइनरी फॉर्मेटर का उपयोग करें। संपूर्ण वर्ग ग्राफ एक समस्या नहीं होनी चाहिए बशर्ते कि किसी भी निहित वस्तुओं को Serializable के रूप में भी चिह्नित किया गया हो।

+0

यह सुनिश्चित नहीं था कि mrbradleyt कक्षा ग्राफ के कुछ हिस्सों को अनदेखा करना चाहता था जब उसने कहा कि वह इसके बारे में चिंता नहीं करना चाहता था। उस स्थिति में, सभी विशेषताओं को Serializable की आवश्यकता नहीं है (NonSerializedAttribute फ़ील्ड को चिह्नित कर सकता है जिन्हें बाहर रखा जाना चाहिए) –

+0

हां, बिंदु लिया गया। उन्होंने यह भी स्पष्ट किया कि उन्हें एक गैर-बाइनरी प्रारूप की आवश्यकता है, इसलिए मेरा समाधान उनके लिए काम नहीं करेगा। –

+0

पूछताछकर्ता ने विशेष रूप से बाइनरी क्रमबद्धता को बाहर कर दिया है। –

1

एक्सएनए फ्रेमवर्क में इंटरमीडिएट सीरिएलाइज़र बहुत अच्छा ठंडा है। तुम भी वस्तुओं [Serializable]

+0

अधिक विशेष रूप से, आप इंटरमीडिएट सीरियलाइज़र से संबंधित शॉन की सभी पोस्ट यहां देख सकते हैं: http://www.talula.demon.co.uk/blogindex.html#intermediateserializer –

1

सोप क्रमबद्धता में इसे प्रयोग पर ट्यूटोरियल के एक झुंड पा सकते हैं।

सीरियलाइजिंग करते समय संग्रह के साथ आपको किस तरह की समस्याएं हैं? यदि आप किसी सूची या किसी समान चीज़ पर उपयोग करने के लिए विशेषताओं को नहीं जानते हैं, तो आप अपनी संपत्ति पर XmlArray विशेषता का प्रयास कर सकते हैं। आप निश्चित रूप से संग्रह को क्रमबद्ध कर सकते हैं।

+0

आप किस श्रेणी का उपयोग करते हैं? – mrbradleyt

+0

मेरा मानना ​​है कि एसओएपी धारावाहिकता का उपयोग नेट 2.0 से निराश है। असल में यह जेनेरिक भी संभाल नहीं करता है। http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/ee4a7a63-290e-432f-bd45-44f4cb7a3467/ –

+0

Serialization.Formatters.Soap – ripper234

2

अपनी आवश्यकताओं को करने से ऐसा लगता है जैसे Xml क्रमबद्धता सबसे अच्छा है के साथ चिह्नित नहीं करने के लिए मेरे लिए अच्छी तरह से काम, http://blogs.msdn.com/shawnhar

+0

में कहीं न कहीं आप XmlArray पर विस्तृत कृपया विशेषता ... मुझे सूची के साथ समस्याएं आ रही थीं .... – mrbradleyt

+0

यदि आप sgen का उपयोग करते हैं तो आपको वास्तव में XmlArray विशेषता की आवश्यकता नहीं है। सामान्य पैटर्न सूची से एक अलग वर्ग प्राप्त करना है, और उसके बाद क्रमशः उदाहरण के लिए क्रमबद्ध करें। [Serializable] सार्वजनिक वर्ग YourObjectCollection: सूची { } हालांकि, मैं पाया है कि यहां तक ​​कि आवश्यक – ilitirit

+0

+1 ilitirit नहीं है। मुझे परेशान करने वाली एक परेशानी वाली समस्या का सामना करना पड़ा जहां मैं टैग को लपेटने के अतिरिक्त सेट के बिना एक सूची को क्रमबद्ध नहीं कर सका, इसलिए मैं इसे डेटासेट में रीडएक्सएमएल नहीं कर सका। –

1

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

3

अगर मैं इसे एक संपत्ति के साथ कुछ इस तरह काम करता है याद करते हैं:

[XmlArray("Foo")] 
[XmlArrayItem("Bar")] 
public List<BarClass> FooBars 
{ get; set; } 

आप इस धारावाहिक यदि आप की तरह कुछ मिल चाहते हैं:

<Foo> 
    <Bar /> 
    <Bar /> 
</Foo> 

बेशक, मैं शायद करने के लिए स्थगित कर देना चाहिए विशेषज्ञों। एमएस से अधिक जानकारी यहां दी गई है: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

मुझे बताएं कि यह आपके लिए काम करता है या नहीं।

1

उन सभी कक्षाओं को रखें जिन्हें आप एक अलग असेंबली में क्रमबद्ध करना चाहते हैं, और उसके बाद एक्सएमएल को क्रमबद्ध करने के लिए एक क्रमबद्धता असेंबली उत्पन्न करने के लिए sgen टूल का उपयोग करें। Serialization को नियंत्रित करने के लिए एक्सएमएल विशेषताओं का उपयोग करें।

आप क्रमबद्धता विधानसभा अनुकूलित करने के लिए की जरूरत है (और आप जरूरत कक्षाएं कि IXmlSerializable नहीं हैं और वर्गों है कि सार नोड्स शामिल समर्थन करने के लिए है कि होगा), तो एक अलग फ़ाइल में स्रोत कोड डंप करने के लिए sgen हिदायत और उसके बाद इसे अपने समाधान में जोड़ें। फिर आप इसे आवश्यकतानुसार संशोधित कर सकते हैं।

http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

Fwiw, मैं पूरे AdsML फ्रेमवर्क (400 से अधिक वर्ग) इस तकनीक का इस्तेमाल क्रमानुसार करने प्रबंधित किया है। इसके लिए बहुत सारे मैन्युअल अनुकूलन की आवश्यकता थी, लेकिन यदि आप ढांचे के आकार पर विचार करते हैं तो इसके आसपास कोई नहीं हो रहा है। (मैं एक अलग उपकरण का उपयोग किया XSD से सी # में जाने के लिए)

0

शायद एक अधिक कुशल मार्ग BinaryFormatter

का उपयोग कर क्रमानुसार करने http://blog.paranoidferret.com/index.php/2007/04/27/csharp-tutorial-serialize-objects-to-a-file/

using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 

public class Serializer 
{ 
    public Serializer() 
    { 
    } 

    public void SerializeObject(string filename, 
        ObjectToSerialize objectToSerialize) 
    { 
     Stream stream = File.Open(filename, FileMode.Create); 
     BinaryFormatter bFormatter = new BinaryFormatter(); 
     bFormatter.Serialize(stream, objectToSerialize); 
     stream.Close(); 
    } 

    public ObjectToSerialize DeSerializeObject(string filename) 
    { 
     ObjectToSerialize objectToSerialize; 
     Stream stream = File.Open(filename, FileMode.Open); 
     BinaryFormatter bFormatter = new BinaryFormatter(); 
     objectToSerialize = 
     (ObjectToSerialize)bFormatter.Deserialize(stream); 
     stream.Close(); 
     return objectToSerialize; 
    } 
} 
0

इंटरऑपरेबिलिटी के लिए हमने हमेशा एक्सएमएल सीरियलाइजेशन का उपयोग किया है और यह सुनिश्चित किया है कि हमारी कक्षा को सही तरीके से करने के लिए जमीन से डिजाइन किया गया हो।

हम एक एक्सएसडी स्कीमा दस्तावेज़ बनाते हैं और XSD.exe का उपयोग करके कक्षाओं का एक सेट जेनरेट करते हैं। यह आंशिक कक्षाएं उत्पन्न करता है, इसलिए हम उन अतिरिक्त विधियों को जोड़ने के लिए संबंधित आंशिक कक्षाओं का एक सेट बनाते हैं जिन्हें हम कक्षाओं को पॉप्युलेट करने और हमारे आवेदन में उनका उपयोग करने में मदद करना चाहते हैं (क्योंकि वे धारावाहिक और deserialising पर केंद्रित हैं और कभी-कभी उपयोग करने के लिए थोड़ा अलग हैं)।

0

आपको NetDataContractSerializer का उपयोग करना चाहिए।इसमें किसी भी प्रकार का ऑब्जेक्ट ग्राफ़ शामिल है और जेनेरिक, सूचियों, पॉलिमॉर्फिज्म का समर्थन करता है (ज्ञात टाइप विशेषता यहां आवश्यक नहीं है), रिकर्सन आदि। एकमात्र कमी यह है कि आपको अपने सभी वर्गों को [सीरियलज़ेबल]/[डेटाकंट्रैक्ट] विशेषताओं के साथ चिह्नित करना होगा , लेकिन अनुभव से पता चलता है कि आपको किसी भी तरह के मैन्युअल फाइन-ट्यूनिंग करना है क्योंकि सभी सदस्यों को जारी नहीं रखा जाना चाहिए। इसके अलावा यह एक एक्सएमएल में क्रमबद्ध है, हालांकि इसकी पठनीयता संदिग्ध है।

हमारे पास आपकी ही आवश्यकताएं थीं और इस समाधान को चुना था।

1

मैं मानता हूं कि डेटाकंट्रैक्ट-आधारित क्रमबद्धता विधियों (जेएसओएन, एक्सएमएल, आदि) के मुकाबले थोड़ा अधिक जटिल है।

आप JSON http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

यह एमएस AJAX एक्सटेंशन का हिस्सा है की जाँच करने की कोशिश कर रहे हैं। माना जाता है कि इसे .NET 3.5 में अप्रचलित के रूप में चिह्नित किया गया है लेकिन स्कॉटगु ने यहां अपनी ब्लॉग टिप्पणी में उल्लेख किया है (http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx#4301973) कि उसे यकीन नहीं है कि क्यों और इसे थोड़ी देर के लिए समर्थित किया जाना चाहिए।

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