दिलचस्प पोस्ट
MySQL में पुनरावर्ती चयन क्वेरी कैसे करें? MySQL recursion? शीर्ष स्तर की विंडो को पुनर्निर्देशित करने से IFRAME को कैसे रोकें केस-असंवेदनशील स्ट्रिंग तुलना सी ++ में अनुक्रमणिका त्रुटि: सीमा से बाहर सूची असाइनमेंट सूची मार्जिन-टॉप को बाहरी डिवा नीचे दबाएं जावा में मानव पठनीय प्रारूप में बाइट आकार कन्वर्ट करने के लिए कैसे? अजाक्स, बैक बटन और डोम अपडेट के बीच अंतर क्या है viewWillAppear: और -viewDidAppear :? मैवेन 2 में मैन्युअल रूप से इंस्टॉल करने के लिए कैसे? टॉमकेट का उपयोग कर एक PHP एप चलाएं? डायलॉग / अलर्टडायलोग्स: डायलॉग अप होने पर "निष्पादन को ब्लॉक" कैसे करें (.नेट-शैली) गिट में वर्तमान प्रतिबद्धता के लिए हैश कैसे प्राप्त करना है? एक्सेस प्रतिबंध: आवश्यक पुस्तकालय पर प्रतिबंध के कारण पहुंच योग्य नहीं है .. \ jre \ lib \ rt.jar आईफोन पर पहली बार ऐप लॉन्च कैसे लगाई जा सकती है

क्यों नहीं है एक XML-serializable शब्दकोश .net में है?

मुझे एक XML-serializable शब्दकोश की आवश्यकता है असल में, अब मेरे पास दो काफी अलग प्रोग्राम हैं जिनकी आवश्यकता है मुझे न देखकर हैरान था कि .NET के पास एक नहीं है। मैंने इस प्रश्न को कहीं और पूछा और व्यंग्यात्मक प्रतिक्रियाएं मिलीं। मुझे समझ में नहीं आता कि यह एक बेवकूफ सवाल क्यों है

क्या कोई मुझे रोशन कर सकता है, यह देखते हुए कि विभिन्न एनएटी पर निर्भर कैसे XML सीरियलाइजेशन पर हैं, क्यों नहीं एक XML-serializable शब्दकोश है उम्मीद है, आप यह भी समझा सकते हैं कि क्यों कुछ लोग मानते हैं कि एक निर्दयी सवाल मुझे लगता है कि मुझे कुछ मूलभूत याद आ रही है और मुझे उम्मीद है कि आप अंतराल को भरने में सक्षम होंगे।

वेब के समाधान से एकत्रित समाधान "क्यों नहीं है एक XML-serializable शब्दकोश .net में है?"

एक्सएमएल सीरियललाइज़ेशन के बारे में बात यह है कि यह सिर्फ बाइट्स की एक धारा बनाने के बारे में नहीं है। यह एक XML स्कीमा बनाने के बारे में भी है जो बाइट्स की इस स्ट्रीम के विरुद्ध मान्य होगी। एक शब्दकोश का प्रतिनिधित्व करने के लिए XML स्कीमा में कोई अच्छा तरीका नहीं है सबसे अच्छा आप यह कर सकते हैं कि यह दिखाने के लिए कि एक अद्वितीय कुंजी है

आप हमेशा अपना आवरण बना सकते हैं, उदाहरण के लिए शब्दकोशों को सीरियलाइज करने के लिए वन वे ।

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

 public static class SerializationExtensions { public static string Serialize<T>(this T obj) { var serializer = new DataContractSerializer(obj.GetType()); using (var writer = new StringWriter()) using (var stm = new XmlTextWriter(writer)) { serializer.WriteObject(stm, obj); return writer.ToString(); } } public static T Deserialize<T>(this string serialized) { var serializer = new DataContractSerializer(typeof(T)); using (var reader = new StringReader(serialized)) using (var stm = new XmlTextReader(reader)) { return (T)serializer.ReadObject(stm); } } } 

यह पूरी तरह से .NET 4 में काम करता है और इसे .NET 3.5 में भी काम करना चाहिए, हालांकि मैंने इसे अभी तक परीक्षण नहीं किया है।

अद्यतन: यह .NET कॉम्पैक्ट फ्रेमवर्क में काम नहीं करता (NETCF 3.7 विंडोज फोन 7 के लिए भी नहीं) के रूप में DataContractSerializer समर्थित नहीं है!

मैंने स्ट्रिंग के लिए स्ट्रीमिंग किया क्योंकि यह मेरे लिए अधिक सुविधाजनक था, हालांकि मैं स्ट्रीम में निम्न-स्तरीय सीरियलाइजेशन शुरू कर सकता था और फिर इसे तार में क्रमबद्ध करने के लिए इस्तेमाल किया था, लेकिन मैं केवल जब आवश्यक होता है सामान्यीकृत करते हैं (जैसे कि समयपूर्व अनुकूलन बुराई है , इसलिए यह समयपूर्व सामान्यीकरण है …)

उपयोग बहुत सरल है:

 // dictionary to serialize to string Dictionary<string, object> myDict = new Dictionary<string, object>(); // add items to the dictionary... myDict.Add(...); // serialization is straight-forward string serialized = myDict.Serialize(); ... // deserialization is just as simple Dictionary<string, object> myDictCopy = serialized.Deserialize<Dictionary<string,object>>(); 

myDictCopy मेरी डिक्ट की एक वर्चुअल कॉपी होगी

आप यह भी देखेंगे कि उपलब्ध सामान्य तरीके किसी भी प्रकार की serialize (मेरे सबसे अच्छे ज्ञान से) करने में सक्षम होंगे क्योंकि यह IDictionary इंटरफेस तक सीमित नहीं है, यह वास्तव में किसी भी सामान्य प्रकार टी हो सकता है।

आशा है कि इसमें किसी को मदद मिलेगी!

उन्होंने एक को नेट 3.0 में जोड़ा। यदि आप कर सकते हैं, तो सिस्टम के लिए एक संदर्भ जोड़ें। समयबद्धता। Serialization और System.Xml.XmlDictionary, System.Xml.XmlDictionaryReader, और System.Xml.XmlDictionaryWriter की खोज करें।

मैं मानता हूं कि यह विशेष रूप से खोजने योग्य जगह नहीं है।

DataContractSerializer का उपयोग करें! नमूना नीचे देखें।

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.Xml; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { A a = new A(); a.Value = 1; B b = new B(); b.Value = "SomeValue"; Dictionary<A, B> d = new Dictionary<A,B>(); d.Add(a, b); DataContractSerializer dcs = new DataContractSerializer(typeof(Dictionary<A, B>)); StringBuilder sb = new StringBuilder(); using (XmlWriter xw = XmlWriter.Create(sb)) { dcs.WriteObject(xw, d); } string xml = sb.ToString(); } } public class A { public int Value { get; set; } } public class B { public string Value { get; set; } } } 

उपरोक्त कोड निम्नलिखित xml का उत्पादन करता है:

 <?xml version="1.0" encoding="utf-16"?> <ArrayOfKeyValueOfABHtQdUIlS xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> <KeyValueOfABHtQdUIlS> <Key xmlns:d3p1="http://schemas.datacontract.org/2004/07/ConsoleApplication1"> <d3p1:Value>1</d3p1:Value> </Key> <Value xmlns:d3p1="http://schemas.datacontract.org/2004/07/ConsoleApplication1"> <d3p1:Value>SomeValue</d3p1:Value> </Value> </KeyValueOfABHtQdUIlS> </ArrayOfKeyValueOfABHtQdUIlS> 

अपनी खुद की एक बनाएँ :-), केवल पढ़ने की सुविधा बोनस है, लेकिन अगर आपको स्ट्रिंग के अलावा अन्य की जरूरत है तो क्लास को कुछ संशोधनों की आवश्यकता है …

 namespace MyNameSpace { [XmlRoot("SerializableDictionary")] public class SerializableDictionary : Dictionary<String, Object>, IXmlSerializable { internal Boolean _ReadOnly = false; public Boolean ReadOnly { get { return this._ReadOnly; } set { this.CheckReadOnly(); this._ReadOnly = value; } } public new Object this[String key] { get { Object value; return this.TryGetValue(key, out value) ? value : null; } set { this.CheckReadOnly(); if(value != null) { base[key] = value; } else { this.Remove(key); } } } internal void CheckReadOnly() { if(this._ReadOnly) { throw new Exception("Collection is read only"); } } public new void Clear() { this.CheckReadOnly(); base.Clear(); } public new void Add(String key, Object value) { this.CheckReadOnly(); base.Add(key, value); } public new void Remove(String key) { this.CheckReadOnly(); base.Remove(key); } public XmlSchema GetSchema() { return null; } public void ReadXml(XmlReader reader) { Boolean wasEmpty = reader.IsEmptyElement; reader.Read(); if(wasEmpty) { return; } while(reader.NodeType != XmlNodeType.EndElement) { if(reader.Name == "Item") { String key = reader.GetAttribute("Key"); Type type = Type.GetType(reader.GetAttribute("TypeName")); reader.Read(); if(type != null) { this.Add(key, new XmlSerializer(type).Deserialize(reader)); } else { reader.Skip(); } reader.ReadEndElement(); reader.MoveToContent(); } else { reader.ReadToFollowing("Item"); } reader.ReadEndElement(); } public void WriteXml(XmlWriter writer) { foreach(KeyValuePair<String, Object> item in this) { writer.WriteStartElement("Item"); writer.WriteAttributeString("Key", item.Key); writer.WriteAttributeString("TypeName", item.Value.GetType().AssemblyQualifiedName); new XmlSerializer(item.Value.GetType()).Serialize(writer, item.Value); writer.WriteEndElement(); } } } } 

यह मेरा कार्यान्वयन है

 using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; using System.Xml.Schema; using System.Xml; namespace Rubik.Staging { [XmlSchemaProvider("GetInternalSchema")] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable { #region IXmlSerializable Members private const string ns = "http://www.rubik.com.tr/staging"; public static XmlQualifiedName GetInternalSchema(XmlSchemaSet xs) { bool keyIsSimple = (typeof(TKey).IsPrimitive || typeof(TKey) == typeof(string)); bool valueIsSimple = (typeof(TValue).IsPrimitive || typeof(TValue) == typeof(string)); XmlSchemas schemas = new XmlSchemas(); XmlReflectionImporter importer = new XmlReflectionImporter(ns); importer.IncludeType(typeof(TKey)); importer.IncludeType(typeof(TValue)); XmlTypeMapping keyMapping = importer.ImportTypeMapping(typeof(TKey)); XmlTypeMapping valueMapping = importer.ImportTypeMapping(typeof(TValue)); XmlSchemaExporter exporter = new XmlSchemaExporter(schemas); if(!keyIsSimple) exporter.ExportTypeMapping(keyMapping); if(!valueIsSimple) exporter.ExportTypeMapping(valueMapping); XmlSchema schema = (schemas.Count == 0 ? new XmlSchema() : schemas[0]); schema.TargetNamespace = ns; XmlSchemaComplexType type = new XmlSchemaComplexType(); type.Name = "DictionaryOf" + keyMapping.XsdTypeName + "And" + valueMapping.XsdTypeName; XmlSchemaSequence sequence = new XmlSchemaSequence(); XmlSchemaElement item = new XmlSchemaElement(); item.Name = "Item"; XmlSchemaComplexType itemType = new XmlSchemaComplexType(); XmlSchemaSequence itemSequence = new XmlSchemaSequence(); XmlSchemaElement keyElement = new XmlSchemaElement(); keyElement.Name = "Key"; keyElement.MaxOccurs = 1; keyElement.MinOccurs = 1; XmlSchemaComplexType keyType = new XmlSchemaComplexType(); XmlSchemaSequence keySequence = new XmlSchemaSequence(); XmlSchemaElement keyValueElement = new XmlSchemaElement(); keyValueElement.Name = keyMapping.ElementName; keyValueElement.SchemaTypeName = new XmlQualifiedName(keyMapping.XsdTypeName, keyMapping.XsdTypeNamespace); keyValueElement.MinOccurs = 1; keyValueElement.MaxOccurs = 1; keySequence.Items.Add(keyValueElement); keyType.Particle = keySequence; keyElement.SchemaType = keyType; itemSequence.Items.Add(keyElement); XmlSchemaElement valueElement = new XmlSchemaElement(); valueElement.Name = "Value"; valueElement.MaxOccurs = 1; valueElement.MinOccurs = 1; XmlSchemaComplexType valueType = new XmlSchemaComplexType(); XmlSchemaSequence valueSequence = new XmlSchemaSequence(); XmlSchemaElement valueValueElement = new XmlSchemaElement(); valueValueElement.Name = valueMapping.ElementName; valueValueElement.SchemaTypeName = new XmlQualifiedName(valueMapping.XsdTypeName, valueMapping.XsdTypeNamespace); valueValueElement.MinOccurs = 1; valueValueElement.MaxOccurs = 1; valueSequence.Items.Add(valueValueElement); valueType.Particle = valueSequence; valueElement.SchemaType = valueType; itemSequence.Items.Add(valueElement); itemType.Particle = itemSequence; item.SchemaType = itemType; sequence.Items.Add(item); type.Particle = sequence; schema.Items.Add(type); xs.XmlResolver = new XmlUrlResolver(); xs.Add(schema); return new XmlQualifiedName(type.Name, ns); } public void ReadXml(System.Xml.XmlReader reader) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); bool wasEmpty = reader.IsEmptyElement; reader.Read(); if (wasEmpty) return; while (reader.NodeType != System.Xml.XmlNodeType.EndElement) { reader.ReadStartElement("Item"); reader.ReadStartElement("Key"); TKey key = (TKey)keySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement("Value"); TValue value = (TValue)valueSerializer.Deserialize(reader); reader.ReadEndElement(); this.Add(key, value); reader.ReadEndElement(); reader.MoveToContent(); } reader.ReadEndElement(); } public void WriteXml(System.Xml.XmlWriter writer) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); foreach (TKey key in this.Keys) { writer.WriteStartElement("Item"); writer.WriteStartElement("Key"); keySerializer.Serialize(writer, key); writer.WriteEndElement(); writer.WriteStartElement("Value"); TValue value = this[key]; valueSerializer.Serialize(writer, value); writer.WriteEndElement(); writer.WriteEndElement(); } } #endregion #region IXmlSerializable Members public XmlSchema GetSchema() { return null; } #endregion } } 

किसी सामान्य (किसी भी मौजूदा) शब्दकोश में IXmlSerializable को वंशानुक्रम का उपयोग किए बिना एक सामान्य सहायक:

 using System.Xml; using System.Xml.Serialization; using System.Collections.Generic; namespace GameSpace { public class XmlSerializerForDictionary { public struct Pair<TKey,TValue> { public TKey Key; public TValue Value; public Pair(KeyValuePair<TKey,TValue> pair) { Key = pair.Key; Value = pair.Value; }//method }//struct public static void WriteXml<TKey,TValue>(XmlWriter writer, IDictionary<TKey,TValue> dict) { var list = new List<Pair<TKey,TValue>>(dict.Count); foreach (var pair in dict) { list.Add(new Pair<TKey,TValue>(pair)); }//foreach var serializer = new XmlSerializer(list.GetType()); serializer.Serialize(writer, list); }//method public static void ReadXml<TKey, TValue>(XmlReader reader, IDictionary<TKey, TValue> dict) { reader.Read(); var serializer = new XmlSerializer(typeof(List<Pair<TKey,TValue>>)); var list = (List<Pair<TKey,TValue>>)serializer.Deserialize(reader); foreach (var pair in list) { dict.Add(pair.Key, pair.Value); }//foreach reader.Read(); }//method }//class }//namespace 

और एक सुविधाजनक धारावाहिक जेनेरिक शब्दकोश:

 using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using System.Collections.Generic; namespace GameSpace { public class SerializableDictionary<TKey,TValue> : Dictionary<TKey,TValue>, IXmlSerializable { public virtual void WriteXml(XmlWriter writer) { XmlSerializerForDictionary.WriteXml(writer, this); }//method public virtual void ReadXml(XmlReader reader) { XmlSerializerForDictionary.ReadXml(reader, this); }//method public virtual XmlSchema GetSchema() { return null; }//method }//class }//namespace 

मुझे पता है कि यह अब मौत के लिए किया गया है, लेकिन यहां मेरा योगदान है मैंने @ लॉडेंवियर और जेक के समाधानों से अच्छे टुकड़े ले लिए और मेरी अपनी धारावाहिक (खेद, मैं ब्रिटिश हूं) शब्दकोश वर्ग लिखा है

 public class SerialisableDictionary<T1, T2> : Dictionary<T1, T2>, IXmlSerializable { private static DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary<T1, T2>)); public void WriteXml(XmlWriter writer) { serializer.WriteObject(writer, this); } public void ReadXml(XmlReader reader) { Dictionary<T1, T2> deserialised = (Dictionary<T1, T2>)serializer.ReadObject(reader); foreach(KeyValuePair<T1, T2> kvp in deserialised) { Add(kvp.Key, kvp.Value); } } public XmlSchema GetSchema() { return null; } } 

मुझे यह दृष्टिकोण पसंद है क्योंकि आपको स्पष्ट रूप से धारावाहिक या निराश नहीं करना होगा, बस एक XmlSerializer के माध्यम से पूरे वर्ग पदानुक्रम को पंप करें और आप कर रहे हैं।