XmlSerializer
इंटरफ़ेस को संभाल नहीं सकता है क्योंकि यह नहीं जानता कि deserialising के दौरान किस प्रकार के निर्माण करना है। इसके आस-पास पहुंचने के लिए आपको IXmlSerializable
इंटरफ़ेस को लागू करके स्वयं को क्रमबद्ध करने के उस भाग को संभालने की आवश्यकता है। यह आपको इस प्रकार को रिकॉर्ड करने की अनुमति देता है ताकि आप इसे फिर से बना सकें (deserialise)।
नीचे दिए गए ListOfIAnimal
वर्ग से पता चलता है कि आवश्यक इंटरफ़ेस को लागू करने के लिए मैंने जेनेरिक सूची List<IAnimal>
को विरासत में कैसे बढ़ाया और बढ़ाया। मैंने आपके पुराने वर्गों को प्रत्येक के लिए एक अतिरिक्त गैर-इंटरफ़ेस फ़ील्ड जोड़ दिया ताकि मैं देख सकूं कि कंक्रीट कक्षाएं क्रमबद्ध और व्यवस्थित हो रही हैं।
आपके कोड की तुलना में मैं List<IAnimal>
के स्थान पर केवल नए प्रकार ListOfIAnimal
का उपयोग कर रहा हूं, अन्य परिवर्तन केवल थोड़ा सा रिफैक्टरिंग हैं।
इसका पूरा कोड, बस इसे अपनी स्वयं की .cs फ़ाइल में कॉपी करें, इसके माध्यम से चरणबद्ध करने के लिए पहले फ़ंक्शन को कॉल करें।
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Serialiser
{
static class SerialiseInterface
{
public static void SerialiseAnimals()
{
String finalXml;
// Serialize
{
var animals = new ListOfIAnimal{
new Dog() { Age = 5, Teeth = 30 },
new Cat() { Age = 6, Paws = 4 }
};
var xmlSerializer = new XmlSerializer(animals.GetType());
var stringBuilder = new StringBuilder();
var xmlTextWriter = XmlTextWriter.Create(stringBuilder, new XmlWriterSettings { NewLineChars = "\r\n", Indent = true });
xmlSerializer.Serialize(xmlTextWriter, animals);
finalXml = stringBuilder.ToString();
}
// Deserialise
{
var xmlSerializer = new XmlSerializer(typeof(ListOfIAnimal));
var xmlReader = XmlReader.Create(new StringReader(finalXml));
ListOfIAnimal animals = (ListOfIAnimal)xmlSerializer.Deserialize(xmlReader);
}
}
}
public class ListOfIAnimal : List<IAnimal>, IXmlSerializable
{
public ListOfIAnimal() : base() { }
#region IXmlSerializable
public System.Xml.Schema.XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader)
{
reader.ReadStartElement("ListOfIAnimal");
while (reader.IsStartElement("IAnimal"))
{
Type type = Type.GetType(reader.GetAttribute("AssemblyQualifiedName"));
XmlSerializer serial = new XmlSerializer(type);
reader.ReadStartElement("IAnimal");
this.Add((IAnimal)serial.Deserialize(reader));
reader.ReadEndElement(); //IAnimal
}
reader.ReadEndElement(); //ListOfIAnimal
}
public void WriteXml(XmlWriter writer)
{
foreach (IAnimal animal in this)
{
writer.WriteStartElement("IAnimal");
writer.WriteAttributeString("AssemblyQualifiedName", animal.GetType().AssemblyQualifiedName);
XmlSerializer xmlSerializer = new XmlSerializer(animal.GetType());
xmlSerializer.Serialize(writer, animal);
writer.WriteEndElement();
}
}
#endregion
}
public interface IAnimal { int Age { get; set; } }
public class Dog : IAnimal { public int Age { get; set;} public int Teeth { get; set;} }
public class Cat : IAnimal { public int Age { get; set;} public int Paws { get; set;} }
}
मैंने पाठक के लिए अभ्यास के रूप में deserialize छोड़ने के बारे में सोचा, लेकिन कोड इसके बिना बहुत उपयोगी नहीं होगा।
स्रोत
2013-02-26 12:33:35
हो सकता है कि इस विषय में आपकी मदद http: // stackoverflow।कॉम/प्रश्न/10225174/उपयोग-डेटाकॉन्ट्राक्सेरियलाइज़र-और-डेटाप्रिएंटप्रोवाइडर-टू-सीरियलाइज-एंड-एन्क्रिप्शन – saramgsilva