What is Serialization in C#

What is Serialization in C#: DataSet व DataTable दोनों ही Objects ReadXml()WriteXml() Methods को Support करते हैं। WriteXml() Method हमें हमारे Object के Contents को एक Local File के रूप में XML Document की तरह Save करने की सुविधा Provide करता है। जबकि ReadXml() Method का प्रयोग करके हम हमारे DataSet/DataTable Object को किसी Specified XML Document की Information से Fill कर सकते हैं।

साथ ही DataSets व DataTables दोनों WriteXmlSchema()ReadXmlSchema() Methods के माध्‍यम से *.xsd File को Save या Load करने की सुविधा को भी Support करते हैं।

उदाहरण के लिए यदि हम हमारे पिछले उदाहरण द्वारा Create किए गए DataSet Object के सारे Data को एक XML File के रूप में Save करके उस XML File के Data को फिर से DataSet Object में Load करना चाहें, तो इस जरूरत को पूरा करने के लिए हम निम्नानुसार एक SaveAndLoadAsXml() नाम का Method Create कर सकते हैं:

        static void SaveAndLoadAsXml(DataSet dsNorthwind)
        {
            // Save this DataSet as XML.
            dsNorthwind.WriteXml("dsNW.xml");
            dsNorthwind.WriteXmlSchema("dsNW.xsd");

            // Clear out DataSet.
            dsNorthwind.Clear();
            
            // Load DataSet from XML file.
            dsNorthwind.ReadXml("dsNW.xml");
        }

यदि हम इस Method को Create करके अपने Main() Method में इसे Call करें, तो Program को Compile व Run करने पर हमें दिखाई देने वाले Output में कोई प्रभाव नहीं पडेगा, लेकिन इस Modification के बाद यदि हम हमारे Project की Hidden Files को देखें, तो हमारे Project के Solution Explorer में निम्न चित्रानुसार हमें dsNW.xml dsNW.xsd नाम की दो नई Files दिखाई देंगी:

What is Serialization in C# - Hindi

यदि हम dsNW.xml File को Open करें, तो इस File का Content कुछ निम्नानुसार दिखाई देता है:

What is Serialization in C# - Hindi

हम समझ सकते हैं कि ये Information Actual में हमारे Northwind DataSet के Products DataTable के Data व Structure की ही XML Formatted Information है। जबकि यदि हम dsNW.xsd नाम की File को Open करें, तो हमें हमारा DataTable निम्न चित्रानुसार Visually दिखाई देने लगता है:

What is Serialization in C# - Hindi

ADO.NET के अलावा हम .NET Application Create करने के लिए XML को भी समान प्रकार से उपयोग में ले सकते हैं। क्योंकि ADO.NET को पूरी तरह से XML को ध्‍यान में रखते हुए Design किया गया था ताकि Data को Platform व Machine Independent तरीके से विभिन्न प्रकार के Operating Systems व Devices द्वारा उपयोग में लिया जा सके व विभिन्न प्रकार की Services Develop करने के लिए Data को Universal तरीके से विभिन्न प्रकार की Programming Languages में बिना किसी Restriction के Use किया जा सके।

इसलिए ADO.NET को बडी ही आसानी से XML Format में तथा XML Formatted Data को बडी ही आसानी से ADO.NET Convert किया जा सकता है और इस काम को सामान्य रूप से DataSet व DataTable Objects के माध्‍यम से किया जाता है। यानी हम DataSet/DataTable Object के Data को XML Format में व XML Data को DataSet/DataTable में बडी ही आसानी से Move कर सकते हैं।

ADO.NET के इस Serialization से सम्बंधित उपरोक्तानुसार एक उदाहरण हम पहले ही देख चुके हैं, जिसमें हमने एक Strongly Typed DataSet Object को Serialize करते हुए XML Format में Save किया है और फिर उस Save की गई XML File को फिर से ADO.NET का प्रयोग करते हुए DataSet के रूप में Read किया है।

हालांकि Visual Studio द्वारा Defined XSD File एक XML Schema Definition Language File ही होती है, जो कि XML Syntax पर आधारित होती है। जबकि जरूरी नहीं है कि हम हमेंशा Strongly Typed DataSet/DataTable को ही Serialize कर सकते हैं, बल्कि हम किसी Non-Typed DataSet/DataTable Object को भी XML Format में ठीक उसी तरह से Serialize कर सकते हैं, जिस तरह से उपरोक्त उदाहरण में Strongly Typed DataSet को Serialize करते हुए XML File के रूप में Save किया है।

यानी यदि हम हमारे किसी Program में Non-Typed DataSet/DataTable Object को Define करते हैं, तो उस DataSet/DataTable Object के Data को XML Format में Save करके किसी भी अन्य Application में उसी XML File को Load कर सकते हैं। परिणामस्वरूप हमें नए Application में समान DataSet/DataTable Object को फिर से Create करने के लिए Codes लिखने की जरूरत नहीं रहती।

क्योंकि जब हम हमारे DataSet/DataTable Object को Serialize करते हैं, तो बनने वाली XML File में हमारे DataSet/DataTables के Data के साथ Schema Related सारी Information भी Save हो जाती है, जिसकी जरूरत फिर से DataSet/DataTable Object को Recreate करने के लिए होती है।

चूंकि सामान्यत: हम Underlying Database की Physical Tables के Data से ही अपने DataSet/DataTables को Fill करते हैं, इसलिए Underlying Database का Schema भी Data के साथ ही Automatically DataSet/DataTable Object में Fill हो जाता है। इसलिए सामान्यत: हमें किसी DataTable/DataTable के लिए Schema Create करने की जरूरत नहीं होती। लेकिन यदि हम हमारे DataSet की विभिन्न DataTables को Manually Create करते हैं, तो हमें हमारे Manually Create किए जाने वाले DataSet/DataTable Objects का अपने Application की Requirement के आधार पर Schema Define करना जरूरी होता है।

पिछले उदाहरण में हमने एक Strongly Typed DataSet Object को XML Format में Save किया था। इसी तरह का एक Example हम निम्नानुसार Non-Typed Object को Use करते हुए भी Create कर सकते है:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace DS_XML_ToFrom
{
    class Program
    {
        private static string connectionString = null;
        private static SqlConnection con = null;

        private static SqlDataAdapter daCustomers = null;
        private static SqlDataAdapter daOrders = null;
        private static SqlDataAdapter daProducts = null;
        private static SqlDataAdapter daOrder_Details = null;

        private static DataSet ds = new DataSet("Northwind");

        private static DataTable dtCustomers = new DataTable("Customers");
        private static DataTable dtOrders = new DataTable("Orders");
        private static DataTable dtProducts = new DataTable("Products");
        private static DataTable dtOrder_Details = new DataTable("Order_Details");

        private static DataRelation drRelation = null;

        static void Main(string[] args)
        {
            DataSetSetup();
            DataSet2XML(ds);
        }

        public static void DataSetSetup()
        {
            //Configuring Connection String and Creating Connection
            connectionString ="Data Source=.\\SQLSERVEREXPRESS;Initial Catalog=Northwind;Integrated Security=True";
            con = new SqlConnection(connectionString);

            //Configuring DataAdapter for Get/Set Data from/to Underlying Database
            daCustomers = new SqlDataAdapter("SELECT * FROM Customers", con);
            daOrders = new SqlDataAdapter("SELECT * FROM Orders", con);
            daProducts = new SqlDataAdapter("SELECT * FROM Products", con);
            daOrder_Details = new SqlDataAdapter("SELECT * FROM [Order Details]", con);

            //Filling DataTables with Underlying DataTable Rows
            daCustomers.Fill(dtCustomers);
            daOrders.Fill(dtOrders);
            daProducts.Fill(dtProducts);
            daOrder_Details.Fill(dtOrder_Details);

            //Adding All DataTables to DataSet Object
            ds.Tables.Add(dtCustomers);
            ds.Tables.Add(dtOrders);
            ds.Tables.Add(dtProducts);
            ds.Tables.Add(dtOrder_Details);

            //Setting Child Relationship between Customers to Orders DataTables
            drRelation = new DataRelation("Customer2Order",ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);
            ds.Relations.Add(drRelation);

            //Setting Child Relationship between Orders to Order_Details DataTables
            drRelation = new DataRelation("Orders2OrderDetails",dtOrders.Columns["OrderID"],dtOrder_Details.Columns["OrderID"]);
            ds.Relations.Add(drRelation);

            //Setting Parent Relationship between Order_Details to Products DataTables
            drRelation = new DataRelation("Products2OrderDetails",dtProducts.Columns["ProductID"],dtOrder_Details.Columns["ProductID"]);
            ds.Relations.Add(drRelation);
        }

        public static void DataSet2XML(DataSet ds)
        {
            ds.WriteXml("Northwind.xml");
        }
    }
}

जब हम इस Program को Run करते हैं, तो Main Program के Execute होने से पहले Main Program की Class में Properties Setup होती हैं, ताकि उन Properties में Stored Data को Program Class के सभी Members Directly Access व Manipulate कर सकें:

फिर जब Main Program Execute होता है तो Execute होती ही DataSetSetup() नाम का Static Method Execute हो जाता है, जो कि DataSet Object के लिए सबसे पहले Connection String व Connection Object Setup करता है।

फिर DataAdapter Objects Setup करने के बाद उनके माध्‍यम से विभिन्न DataTable Objects को Underlying Database की Tables के Actual Data से Fill करता है तथा अन्त में सभी Filled DataTable Objects को DataSet Object में Add करने के बाद उनके बीच की Relationships को Configure करता है। इस Method के Codes की Working को अगले Chapter में Detail से Discuss किया गया है।

जब DataSetSetup() Method पूरी तरह से Execute हो जाता है, तब DataSet2XML() नाम का Method Call होता है, जो कि Parameter के रूप में DataSetSetup() Method द्वारा Configure किए गए DataSet Object को Parameter के रूप में Pass कर देता है। इस Parameter के रूप में आने वाले DataSet Object के लिए जब निम्नानुसार Statement Execute होता है:

ds.WriteXml(“Northwind.xml“);

तो Application की Current Location पर Northwind.xml नाम की एक File Create हो जाती है, जिसमें DataSetSetup() Method द्वारा Configure किए गए DataSet Object की XML Formatted Information होती है।

यदि हम हमारे Visual Studio के Solution Explorer की Hidden Files को Show करने के लिए “PROJECT => Show All Files” Option को Click करें, तो हम देख सकते हैं कि Current Project के bin\debug Folder में “Northwind.xml” नाम की एक नई File Create हो गई है:

What is Serialization in C# - Hindi

इस Create होने वाली XML File में हमारे Current Project के DataSet Object में Stored सारे Data के साथ सभी Schema Information भी Exist है। इसलिए यदि हम इस File को किसी दूसरे Application में Use करना चाहें, तो बिना किसी परेशानी के बिना किसी तरह का Code लिखे हुए इस XML File के माध्‍यम से फिर से DataSet Object Create कर सकते हैं और उसे उस नए Project में Use कर सकते हैं। इस Concept को समझने के लिए हम एक और नया Console Mode Application Create कर सकते हैं, जिसके Main Program की Coding कुछ निम्नानुसार है:

using System;
using System.Data;
using System.Data.SqlClient;

namespace XML_DS
{
    class Program
    {
        private static DataSet ds = new DataSet();

        static void Main(string[] args)
        {
            XML2DS("Northwind.xml");

            Console.WriteLine("DataSet Name: " + ds.DataSetName );
            Console.WriteLine("DataTable Names: " + ds.Tables[0].TableName + ", " + ds.Tables[1].TableName + ", " + 
ds.Tables[2].TableName + ", " + ds.Tables[3].TableName);
        }

        static void XML2DS(string XMLFileURL)
        {
            ds.ReadXml(XMLFileURL);
        }
    }
}

जब हम इस नए Console Mode Application Program को Run करते हैं, तो सबसे पहले के नाम का एक नया DataSet Object Create होता है और इस फिर Main Method Execute होता है। Main Method के Execute होते ही XML2DS() नाम का Method Execute होता है, जिसमें Parameter के रूप में “Northwind.xml” नाम को Specify किया गया है, जो XMLFileURL नाम के एक String Parameter को प्राप्त होता है।

चूंकि Northwind.xml File वही XML File है, जिसे हमने पिछले Example के माध्‍यम से Create किया है। इसलिए इस File का पूरा Path न Specify करना पडे, इसलिए हमने इस File को Current Console Application Project के bin\debug Folder में निम्न चित्रानुसार Copy कर दिया है:

What is Serialization in C# - Hindi

XML2DS() Method में आने वाले XMLFileURL नाम के इस Parameter को अगले Statement में निम्नानुसार ReadXml() Method में Pass कर दिया गया है:

ds.ReadXml(XMLFileURL);

जहां ReadXml() Method इस Parameter में Stored “Northwind.xml” नाम की XML File के आधार पर Current Console Application के लिए एक नया DataSet Object Setup करता है। फिर जब Main Method के निम्न Statements Execute होते हैं:

Console.WriteLine("DataSet Name: " + ds.DataSetName );
Console.WriteLine("DataTable Names: " + 
ds.Tables[0].TableName + ", " + 
ds.Tables[1].TableName + ", " + 
ds.Tables[2].TableName + ", " + 
ds.Tables[3].TableName);

जैसे ही ये Code Run होता है, हमें निम्नानुसार Output प्राप्त होता है:

What is Serialization in C# - Hindi

इस Output में हम देख सकते हैं कि हालांकि हमने हमारे Current Console Application में कोई भी DataTable या अन्य Disconnect Object Create नहीं किया है न ही हमने हमारे DataSet Object का नाम Specify किया है, फिर भी हमारे Current Application के ds नाम के DataSet Object का नाम “Northwind” Show हो रहा है तथा इस DataSet Object में Customers, Orders, Products Order_Details नाम की में DataTables Exist हैं।

ये Disconnected Objects हमारे Current Application में इसीलिए Exist हैं, क्योंकि हमने हमारे Current Application में ds नाम के DataSet Object को Northwind.xml नाम की XML File के Data से Load किया है।

इस प्रकार से हम अपने किसी भी Application के Strongly Typed या Non-Typed DataSet/DataTable Object के Data व उसके Schema को एक XML File के रूप में Save कर सकते हैं और फिर उसी XML File के Data को फिर से अपने किसी अन्य Application में पहले वाले DataSet/DataTable Object के Data को Setup करके उपयोग में ले सकते हैं।

Default रूप से जब हम WriteXml() Method को Use करते हैं, तो ये Method हर DataTable के DataRows की Information को ही XML File में Save करता है, जबकि DataSet Object के Schema Structure की Information को Save नहीं करता। DataSet Schema के अन्तर्गत विभिन्न DataTables के विभिन्न Columns पर Apply किए गए Constraints, विभिन्न DataTables के बीच Apply की गई Relationship आदि की Information होती है।

इसलिए यदि हम हमारे DataSet Object की Schema Information के साथ DataTables में Stored Data को XML File के रूप में Save करना चाहते हैं, तो हम WriteXml() Method Call करते समय दूसरे Argument के रूप में XmlWriteMode.WriteSchema Enum Value को Pass करना जरूरी होता है, जिसके बारे में हमने पिछले Example में भी Discuss किया था।

इसी तरह से कभी-कभी हमें केवल DataSet Schema को ही XML Format में Serialize करना होता है, उस स्थिति में हम WriteXml() Method के स्थान पर WriteXmlSchema() Method को Use करते हैं। जैसे:

ds.WriteXmlSchema(targetSchemaFile);

जब हम केवल Schema ही Serialize करना चाहते हैं, तब हमें targetSchemaFile Parameter के रूप में किसी Filename, Stream, TextWriter या XmlWriter Object को Pass करना होता है। जबकि हम चाहे जिस तरह का Parameter Pass करते हैं, XmlWriteMode के रूप में दूसरे Parameter की तरह हमें उसी तरह का Enum मान भी Specify करना होता है।

जिस तरह से हम DataSet Object के लिए WriteXml()/ReadXml() WriteXmlSchema()/ReadXmlSchema() Methods को Use करके DataSet Object की सभी DataTables को एक ही Statement द्वारा XML Format में Serialize करते हैं, उसी तरह से इन Methods को हम Individual DataTables के साथ भी Use कर सकते हैं और Individual DataTables को भी XML Format में Serialize कर सकते हैं।

XmlReadMode Enum Values

WriteXml() Method में दूसरे Argument के रूप में हम true/false मान भी Pass कर सकते हैं, जो कि इस बात को Indicate करता है कि क्या XML Format में Serialize होने वाले Object से Associated Child DataTable, जो कि DataRelation Objects के माध्‍यम से Linked हैं, के Schema या Data को भी XML Format में Serialize करना है या नहीं। जैसे:

ds.WriteXmlSchema(targetSchemaFile, true);

जबकि यदि हम Serialize होने वाले XML Content को Current Application में Use करने के लिए Hold रखना चाहते हैं, तो DataSet Class में GetXml() GetXmlSchema() नाम के दो और Methods होते हैं, जो WriteXml() WriteXmlSchema() Methods द्वारा Return होने वाले Output के String Representation को Return करते हैं। जबकि DataTable.GetDataTableSchema Method का प्रयोग करके हम किसी Table को Plain String Format के XSD को Return कर सकते हैं।

इसी तरह से जब हम किसी XML Format में Serialized DataSet/DataTable को ReadXml() ReadXmlSchema() के माध्‍यम से Current Visual Studio Application में Read करना चाहते हैं, तब Read की जाने वाली Serialized File के रूप में हमें Filename, Stream, TextReader या XmlReader को Parameter की तरह इन Methods में Pass करना होता है। जबकि दूसरे Parameter की तरह हमें निम्न में से किसी Enumerated Value को Specify करना होता है:

XmlReadMode.Auto Value

इस मान को Specify करने पर आने वाले Content को ReadXml() Method स्वयं अपने स्तर पर Handle करता है। यदि इसे Valid Schema व Data प्राप्त होता है, तो ये Method उस Schema को Process करने के बाद Data को Load करता है। जबकि यदि इस Method को DiffGram प्राप्त होता है, तो ये Method इस मान के आधार पर Incoming Data को Appropriate तरीके से Process करता है। यदि हम ReadXml() Method में दूसरे Parameter के रूप में कोई मान Specify नहीं करते, ये मान Default रूप से दूसरे Parameter के रूप में Applied रहता है।

XmlReadMode.ReadSchema Value

इस मान को Specify करने पर आने वाले Content के आधार पर ReadXml() Method DataSet Object के DataTable Members को Reconstruct करता है लेकिन DataTable के Data को Load नहीं करता।

XmlReadMode.IgnoreSchema Value

इस मान को Specify करने पर आने वाले Content के आधार पर ReadXml() Method केवल DataTable के Data को Load करता, जबकि आने वाले Content को DataTables का Schema Construct करने के लिए Use नहीं करता बल्कि Existing DataSet Structure को Use करता है।

XmlReadMode.InferSchema Value

इस मान को Specify करने पर आने वाले Content के आधार पर ReadXml() Method एक नया Schema Create करता है, लेकिन Incoming Schema को Ignore कर देता है।

XmlReadMode.DiffGram Value

इस मान को Specify करने पर आने वाले Content के आधार पर ReadXml() Method पिछले WriteXml() द्वारा XmlWriteMode.DiffGram Mode के साथ Write किए गए Content को Read करता है।

XmlReadMode.Fragment Value

इस मान को Specify करने पर आने वाले Content के आधार पर ReadXml() Method ऐसे XML Content को Read करता है, जो Incomplete या partial होता है।

XmlReadMode.InferTypedSchema Value

ये मान XmlReadMode.InferSchema की तरह ही काम करता है लेकिन हर Incoming Data Column के Data Type को का पता लगाता है और Column Type के आधार पर नया Schema Create करता है।

ReadXml()ReadXmlSchema() दोनों ही Methods Inline व Linked XSD Structure Definition को Support करते हैं। DataSet Object के साथ हमें XmlReadMode.InferXmlSchema Method भी प्राप्त होता है। ये Method ReadXmlSchema() Method की तरह ही काम करता है, लेकिन हम इसमें Import को Exclude करने के लिए Namespaces का Array भी Pass कर सकते हैं।

Read व Write Methods हमेंशा Valid XML Generate करते हैं, जिन्हें किसी भी XML Tool में  Directly उपयोग में लिया जा सकता है। फिर भी ADO.NET हमें Namespace, Child Table Nesting व Column Management करने से सम्बंधित तीन Extra Features Provide करता है, जिनके आधार पर हम Generate होने वाले XML को Control कर सकते हैं।

What is a Data Table - Working with DataTable Object
C# XML Serialization - DataSet and DataTable

ADO.NET with C# in Hindi - BccFalna.com: TechTalks in Hindi ये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

ADO.NET with C# in Hindi | Page:501 | Format: PDF

BUY NOW GET DEMO REVIEWS