C# ile Xml Serialize / Deserialize
Hazır taze kullanmışken C# ile Xml Serialize/Deserialize nasıl yapılıyor onu da bir anlatayım, benim gibi ilk kez uğraşacaklara bir başlangıç noktası olsun.
C# ile Xml Serialize/Deserialize için öncelikle kullanılacak olan Xml’den Xsd (Xml şema dökümanı) dosyası oluşturup bu dosya ile de .NET Framework’ün xsd.exe aracını kullanarak XML’in deserialize ile dönüştürüleceği sınıf dosyanızı oluşturmanız gerekli. Xsd oluşturmak için Xml dosyası Visual Studio üzerinde açıkken XML menüşünden Create Schema seçeneğini seçmeniz yeterli. Oluşturulan Xsd üzerinde gerekli gördüğünüz kısımları eğer anlıyorsanız düzenleyebilirsiniz. Xsd oluşturma işiniz bittikten sonra bir yere kaydedip sırasıyla Başlat -> Programlar -> Microsoft Visual Studio 2008 (veya kullandığınız versiyon) -> Visual Studio Tools -> Visual Studio 2008 Command Prompt seçerek Visual Studio 2008 komut satırını açın. Eğer komut satırını buradan açmazsanız xsd.exe’yi bulamayabilirsiniz. Xsd’den sınıf oluşturmak için örnek komut aşağıdaki gibi:
xsd "xsd dosyasının yolu" /c /l:cs /o:"oluşturulacak kod dosyasının kaydedileceği klasörün yolu"
Burada /l:cs parametresi oluşturulan kodun C# olmasını sağlıyor. /l: kısmından sonra C# için cs, VisualBasic.NET için vb, J# için js, Visual J# için vjs ve Visual C++ .NET için cpp vermek gerekiyor. Diğer parametreler için xsd.exe’nin help kısmına bakabilirsiniz.
Buraya kadar geldiyseniz kullanmanız gereken metodlar ile devam edelim:
(Serialize: nesne->xml | Deserialize: xml->nesne)
XML karakter dizisinden bir nesne oluşturacak olan Deserialize metodu:
/// <summary> /// Verilen bir XML karakter dizisinden verilen tipte bir nesne oluşturur. /// </summary> /// <param name="xml">XML karakter dizisi</param> /// <param name="encoding">XML karakter dizisinin karakter kodlaması</param> /// <returns>XML'den oluşturulan nesne</returns> public static T Deserialize<T>(string xml, Encoding encoding) { try { using (MemoryStream memoryStream = new MemoryStream(StringToByteArray(xml, encoding))) { using (XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, encoding)) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); return (T)xmlSerializer.Deserialize(memoryStream); } } } catch { return default(T); } }
Bir nesneden XML oluşturacak Serialize metodu:
/// <summary> /// Verilen bir nesneden bir XML karakter dizisi oluşturur /// </summary> /// <param name="obj">XML karakter dizisine dönüştürülecek nesne</param> /// <param name="encoding">Hedef XML karakter dizisinin karakter kodlaması</param> /// <param name="noNameSpace">XML'in kök etiketinde namespace tanımlaması olmasın</param> /// <param name="noXmlDecleration">XML'in başında XML dosyası tanımlama etiketi olmasın</param> /// <returns>obj nesnesinden oluşturulan XML karakter dizisi</returns> public static string Serialize<T>(T obj, Encoding encoding, bool noNameSpace, bool noXmlDecleration) { string xml = string.Empty; MemoryStream memoryStream = new MemoryStream(); XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.Encoding = encoding; xmlWriterSettings.OmitXmlDeclaration = noXmlDecleration; xmlWriterSettings.Indent = true; try { if (noNameSpace) { using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings)) { XmlSerializerNamespaces xmlSerializerNamespaces = new XmlSerializerNamespaces(); xmlSerializerNamespaces.Add("", ""); xmlSerializer.Serialize(xmlWriter, obj, xmlSerializerNamespaces); } } else { using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings)) { xmlSerializer.Serialize(xmlWriter, obj); } } xml = ByteArrayToString(memoryStream.ToArray(), encoding); } catch { } finally { memoryStream.Close(); } return xml; }
byte dizisinden karakter dizisi ve karakter dizisinden byte dizisi oluşturacak yardımcı metodlar:
/// <summary> /// Verilen bir karakter dizisini verilen karakter kodlaması ile bir byte dizisine dönüştürür /// </summary> /// <param name="str">byte dizisine dönüştürülecek karakter dizisi</param> /// <param name="encoding">Hedef byte dizisinin karakter kodlaması</param> /// <returns>Karakter dizisinden oluşturulan byte dizisi</returns> private static byte[] StringToByteArray(string str, Encoding encoding) { return encoding.GetBytes(str); } /// <summary> /// Verilen bir byte dizisini verilen karakter kodlaması ile bir karakter dizisine dönüştürür /// </summary> /// <param name="byteArray">Karakter dizisine dönüştürülecek byte dizisi</param> /// <param name="encoding">Byte dizisinin karakter kodlaması</param> /// <returns>Byte dizisinden oluşturulan karakter dizisi</returns> private static string ByteArrayToString(byte[] byteArray, Encoding encoding) { return encoding.GetString(byteArray); }
Örnek bir kullanımı da verip bitireyim:
Deserialize:
MyClass obj = Deserialize<MyClass>(sourceXML, Encoding.UTF8); // obj nesnesinin herhangi kullanımı
Serialize:
MyClass obj = new MyClass(); // örnek bir nesne ... string targetXML = Serialize(obj, Encoding.UTF8, true, true);
Not: Örnek bir XML ve bunun sınıf dosyasını paylaşmıyorum çünkü bu yazı için çok gerekli değil. Burada Serialize/Deserialize metodları genel tipte hazırlanmış durumda, nesne tipiniz ne olursa olsun rahatlıkla kullanılabilir. Ayrıca metodlarda kullanılan sınıfların hangi namespace’lerde olduklarını da tek tek yazmıyorum, Visual Studio bunları size önerecektir, siz de otomatik ekleyebilirsiniz.



