C# XML Serialization: Generate होने वाली File में namespace नाम का एक Feature होता है, जो हमें हमारे Content को XML Tags के अलावा एक और तरीके के माध्यम से Purpose के आधार पर Group करने की सुविधा देता है।
ADO.NET की तीन मुख्य Classes DataSet, DataTable व DataColumn में वे Properties Included हैं, जिनका प्रयोग Namespace व Namespace Prefix दोनों को Specify करने के लिए किया जा सकता है, जो कि Table व Column Values के साथ Associated XML Tags के साथ Appear होते हैं।
इन तीनों ही Classes में Namespace नाम की एक Property होती है, जिसमें Target XML Namespace Name को एक String के रूप में Specify किया जाता है। जबकि तीनों ही Classes में Prefix नाम की एक और Property होती है, जो कि XML विभिन्न XML Tags के साथ Pre-pended रहता है, जो कि किसी Particulars Namespace से Belong करता है। Generate होने वाली Serialized XML File के लिए इन दोनों Properties को हम निम्नानुसार Set कर सकते हैं:
public static void DataSet2XML(DataSet ds) { ds.Namespace = "business"; ds.Prefix = "buz"; ds.WriteXml("Northwind.xml"); }
जैसाकि हम इस Modified DataSet2XML() Method में देख सकते हैं, हमने अपने ds DataSet Object के Namespace व Prefix Property को Set किया है। इसलिए जब हम इस Modified DataSet2XML() Method वाले Console Application को फिर से Run करते हैं, तो इस बार बनने वाली Northwind.xml File का Code कुछ निम्नानुसार होता है:
<?xml version="1.0" standalone="yes"?> <buz:Northwind xmlns:buz="business"> <Customers xmlns="business"> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <ContactName>Maria Anders</ContactName> <ContactTitle>Sales Representative</ContactTitle> <Address>Obere Str. 57</Address> <City>Berlin</City> <PostalCode>12209</PostalCode> <Country>Germany</Country> <Phone>030-0074321</Phone> <Fax>030-0076545</Fax> </Customers> <Customers xmlns="business"> <CustomerID>ANATR</CustomerID> … … </Customers> <Customers xmlns="business"> <CustomerID>ANTON</CustomerID> … … </Customers> <Customers xmlns="business">. . . . . . . . .
DataTable Constructor में भी Namespace नाम का एक Parameter होता है। इसलिए यदि हम चाहें तो DataTable Object Declare करते समय भी Namespace को Specify कर सकते हैं। जबकि DataSet या DataColumn Object के Constructor में हम इस Parameter को Specify नहीं कर सकते।
Namespace व Prefix Settings Override-able हैं। इसलिए इन Values को DataSet Object Level पर Set करके हम सभी DataTables को प्रभावित कर सकते हैं। जबकि उन DataTables पर इस Change का कोई प्रभाव नहीं पडता, जिनका स्वयं का Distinct Namespace Value Specified होता है। जबकि DataTable Level पर Specify किया गया Namespace व Prefix, सभी DataColumns को प्रभावित करता है।
Nesting Child Tables
Default रूप से DataSet Object की हर DataTable में सभी Rows का Output समान Level पर होता है। जबकि एक ऐसा DataSet जिसमें दो DataTables के बीच Master/Detail या Parent/Child की Relationship हो, में हर Master Record से Related सभी Child Records समान Level पर नहीं हो सकते।
इस स्थिति में बेहतर यही होता है कि Generate होने वाली Serialized XML File में सभी Child Records एक प्रकार से Nested Records की तरह Contained हों। यानी सभी Child Records, Parent Record के XML Element के बीच Nested हों। जब हम DataTable के लिए ReadXml() Method को Use करते हैं, तो ये काम Automatically हो जाता है। लेकिन जब हम Entire DataSet को Serialized कर रहे होते हैं, तब हमें Relate होने वाली दोनों Tables के बीच Link Set करने वाले DataRelation Object की Nested property को true Value Set करना जरूरी होता है। जैसे:
//Setting Child Relationship between Customers to Orders DataTables DataRelation drCust2Ord = new DataRelation("Customer2Order",ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]); drCust2Ord.Nested = true;
यदि हम हमारे पिछले Example में ही इस Statement को Specify कर दें, तो इस बार Generate होने वाली XML File के Content कुछ निम्नानुसार होते हैं:
<?xml version="1.0" standalone="yes"?> <buz:Northwind xmlns:buz="business"> <Customers xmlns="business"> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <ContactName>Maria Anders</ContactName> <ContactTitle>Sales Representative</ContactTitle> <Address>Obere Str. 57</Address> <City>Berlin</City> <PostalCode>12209</PostalCode> <Country>Germany</Country> <Phone>030-0074321</Phone> <Fax>030-0076545</Fax> <Orders> <OrderID>10643</OrderID> <CustomerID>ALFKI</CustomerID> … </Orders> <Orders> <OrderID>10692</OrderID> <CustomerID>ALFKI</CustomerID> … </Orders> <Orders> <OrderID>10702</OrderID> <CustomerID>ALFKI</CustomerID> … </Orders> <Orders> <OrderID>10835</OrderID> <CustomerID>ALFKI</CustomerID> … </Orders> <Orders> <OrderID>10952</OrderID> <CustomerID>ALFKI</CustomerID> … </Orders> <Orders> <OrderID>11011</OrderID> <CustomerID>ALFKI</CustomerID> … </Orders> </Customers> <Customers xmlns="business"> <CustomerID>ANATR</CustomerID> <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> <ContactName>Ana Trujillo</ContactName> <ContactTitle>Owner</ContactTitle> <Address>Avda. de la Constitución 2222</Address> <City>México D.F.</City> <PostalCode>05021</PostalCode> <Country>Mexico</Country> <Phone>(5) 555-4729</Phone> <Fax>(5) 555-3745</Fax> <Orders> <OrderID>10308</OrderID> <CustomerID>ANATR</CustomerID> … </Orders> <Orders> <OrderID>10625</OrderID> <CustomerID>ANATR</CustomerID> … … </Customers> <Customers xmlns="business"> <CustomerID>ANTON</CustomerID> … …
यदि हम इस XML File के Code व पिछले Code Segment को देखें तो दोनों के बीच का अन्तर बडी ही आसानी से समझ में आ सकता है। क्योंकि पिछले XML Code Segment के आधार पर Generate होने वाली Serialized XML File में केवल Customers की Information ही Contained है। जबकि Nested Property को true Set कर देने की वजह से Customer की Information के बाद उसके द्वारा Place किए गए सभी Orders की Detail भी Nested Form में Display हो रही है।
Binary Serialization of DataTable/DataSet Objects
जिस तरह से हम हमारे DataTable/DataSet Object के Data को XML Format में Serialize कर सकते हैं, उसी तरह से ADO.NET हमें हमारे इन Objects को Binary Format में भी Serialize करने की सुविधा Provide करता है। Binary Serialization उस स्थिति में काफी उपयोगी होता है, जबकि हम Distributed Environment में काम कर रहे होते हैं।
XML Data Representation की एक मुख्य परेशानी ये है कि ये बहुत ही Descriptive Format में Data को Represent करता है, जिसकी वजह से कम Data को Represent करने के लिए भी हमें बहुत सारे XML Elements Create व Manage करने पडते हैं।
इसलिए DataTables व DataSets को Binary Format में Manage करने के लिए हमें इन Objects की RemotingFormat Property को SerializationFormat.Binary Value से Set करना होता है। DataTable व DataSets Object के Data को Binary Format में Serialize करने के लिए भी हम निम्नानुसार एक Method Create कर सकते हैं, हालांकि ये Method जिन Classes को Use करता है, उन्हें System.IO व System.Runtime.Serialization.Formatters.Binary Namespaces में Define किया गया है, इसलिए इस Method को Create करते समय हमें इन दोनों Namespaces को अपने Program में Include करना जरूरी होता है:
static void SaveAndLoadAsBinary(DataSet dsNorthwind) { // Set binary serialization flag. dsNorthwind.RemotingFormat = SerializationFormat.Binary; // Save this DataSet as binary. FileStream fs = new FileStream("BinaryProducts.bin", FileMode.Create); BinaryFormatter bFormat = new BinaryFormatter(); bFormat.Serialize(fs, dsNorthwind); fs.Close(); // Clear out DataSet. dsNorthwind.Clear(); // Load DataSet from binary file. fs = new FileStream("BinaryProducts.bin", FileMode.Open); DataSet data = (DataSet)bFormat.Deserialize(fs); }
जब हम इस Method को Define करके Main() Method के माध्यम से Invoke करते हैं, तो इस बार BinaryProducts.bin नाम की Binary File Create होती है, जो कि Binary Format में DataSet/DataTable Object को Represent करता है। इस Binary Formatted File को भी हम Visual Studio की Hidden Files के माध्यम से Open करके निम्न चित्रानुसार देख सकते हैं:
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
ADO.NET with C# in Hindi | Page:501 | Format: PDF