2010-01-12 14 views
5

मैंने अभी यह सीरियलाइजेशन हैल्पर कक्षा लिखा है, लेकिन मुझे विश्वास नहीं है कि यह आवश्यक है!क्या मुझे वास्तव में यह "SerializationHelper" लिखने की ज़रूरत है?

using System.IO; 
using System.Xml.Serialization; 

public static class SerializationHelper 
{ 
    public static string Serialize<T>(T obj) 
    { 
     var outStream = new StringWriter(); 
     var ser = new XmlSerializer(typeof(T)); 
     ser.Serialize(outStream, obj); 
     return outStream.ToString(); 
    } 

    public static T Deserialize<T>(string serialized) 
    { 
     var inStream = new StringReader(serialized); 
     var ser = new XmlSerializer(typeof(T)); 
     return (T)ser.Deserialize(inStream); 
    } 
} 

और यह इस तरह किया जाता है:

var serialized = SerializationHelper.Serialize(myObj); 

और:

नेट ढांचे में
var myObj = SerializationHelper.Deserialize<MyType>(serialized) 

मुझे याद आ रही कुछ? यह रॉकेट साइंस नहीं है!

+0

मैंने आपके जेनेरिक सीरियलाइज कार्यान्वयन को आपूर्ति करने के लिए .NET ढांचे में कुछ भी नहीं देखा है। –

+5

यह शायद -100 से शुरू होने वाली सुविधाओं का एक मामला है (http://blogs.msdn.com/ericlippert/archive/2009/06/15/making-it-easier.aspx पैराफ्रेश करने के लिए)। बीसीएल डिजाइनरों ने यह नहीं सोचा होगा कि एक्सएमएल स्ट्रिंग्स (और इसके विपरीत) से ऑब्जेक्ट्स बनाने से एपीआई में विशेषताओं को जोड़ने में सभी काम मिलते हैं - * विशेष रूप से * क्योंकि यह रॉकेट विज्ञान नहीं है! –

+0

आम तौर पर सीरियलाइजेशन जेनेरिक सीरिएलाइज़र की बजाय टी का एक कार्य होता है। ऐसा इसलिए है क्योंकि इसे पुनर्स्थापित करने के लिए कक्षा से सबकुछ क्रमबद्ध करना हमेशा आवश्यक नहीं है, इस प्रकार विशिष्ट ज्ञान वाले वर्ग इस गतिविधि को करने के लिए बेहतर सूचित स्थान है। – Lazarus

उत्तर

0

यह उपयोगी है अगर आप किसी परियोजना के भीतर क्रमिकरण/deserialization की वास्तविक राशि (> 1) कर रहे हैं। यह मेरे लिए एक बार मामला था, इसलिए मैंने अन्य पुन: प्रयोज्य कार्यों के साथ, एक यूटिल लाइब्रेरी में एक समान वर्ग रखा।

1

वास्तव में, बिट्स जहां नेट एपीआई फोन ये हैं:

var ser = new XmlSerializer(typeof(T)); 
ser.Serialize(outStream, obj); 

var ser = new XmlSerializer(typeof(T)); 
var obj = (T) ser.Deserialize(inStream); 

कोड के बाकी अपने व्यक्तिगत विशेषज्ञता है। मुझे नहीं लगता कि एक एपीआई कॉल करने के लिए कोड की दो पंक्तियां बहुत अधिक हैं। आप उन्हें हमेशा परेशान कर सकते हैं, उदा।

(new XmlSerializer(typeof(T))).Serialize(outStream, obj); 

var obj = (T) (new XmlSerializer(typeof(T))).Deserialize(inStream); 

शुद्ध रूप से एक अलग रूप में के रूप में, मैं कहना चाहिए कि मैं एक कोड गंध के रूप में स्ट्रिंग चर में XML डेटा भंडारण में मानते हैं। जैसे ही आप अपने कच्चे बाइनरी फॉर्म (XDocument, XmlDocument, XPathDocument या किसी अन्य प्रकार के डीओएम) से एक्सएमएल डेटा लेते हैं, तो आप एन्कोडिंग समस्याओं के खिलाफ दौड़ते हैं। क्या होगा यदि कोई डेवलपर एन्कोडिंग एक्स के साथ एक स्ट्रिंग को ऑब्जेक्ट करता है, तो एन्कोडिंग वाई के साथ डिस्क फ़ाइल में स्ट्रिंग लिखता है? बहुत सुरक्षित नहीं है। इसके अलावा, अगर एन्कोडिंग एक्स यूटीएफ -16 नहीं है, तो आप .NET स्ट्रिंग में डेटा का प्रतिनिधित्व कैसे करेंगे?

+0

का उपयोग करना चाहूंगा, आप अपनी आखिरी पंक्ति में टी को कास्ट गायब कर रहे हैं। .. अन्यथा मुझे एक "ऑब्जेक्ट" मिलता है। और आप अपने "कंडेनसिंग" से बाहर निकल रहे हैं कि मुझे इस प्रकार का नाम स्पष्ट रूप से बहुत उल्लेख करना है, जो मेरा समाधान – JoelFan

+0

पर रोक लगाता है अच्छी तरह से देखा गया है, मैंने टेक्स्ट संपादित किया है। –

+0

जोएल, मैं सहमत हूं, यह बहुत अधिक टाइपिंग है। आपको खुद से पूछना है कि किस समय टाइपिंग स्वयं को बचाने के लिए उपयोगिता विधि लिख रही है, समय बर्बाद हो जाती है? यदि आपके तरीके वास्तव में आपको समय बचाते हैं और अपना कोड अधिक पठनीय बनाते हैं, तो यह बढ़िया है, उन्हें रखें। मैं बस इतना कह रहा हूं, 'XmlSerializer' एपीआई के डिजाइनर आपके साथ सहमत नहीं थे। –

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