A .NET keretrendszer egyik általam rendkívül kedvelt szolgáltatása az XML szerializáció. Mostanában az adatszerkezeteket úgy tervezem meg, hogy előtte egy XML file-ban jelenítem meg az elérni kívánt adatstruktúrát, majd ehhez igazítom az adatokat kezelő osztályt. Egy egyszerű példával élve a Pocket Revelation-ből, ahol az XML állomány formátuma eleve adott:

<?xml version="1.0" encoding="utf-8" ?>
<revelationdata version="0.4.7" dataversion="1">
 
	<entry type="folder">
		<name>Folder</name>
		<description>Description of the folder</description>
		<updated>1153820841</updated>
 
		<entry type="folder">
			<name>Subfolder</name>
			<description>Description of the subfolder</description>
			<updated>1153904513</updated>
 
			<entry type="creditcard">
				<name>CreditCard name</name>
				<description>CreditCard description</description>
				<updated>1153820891</updated>
				<field id="creditcard-cardtype">Card type</field>
				<field id="creditcard-cardnumber">Card number</field>
				<field id="creditcard-expirydate">Expirity date</field>
				<field id="creditcard-ccv">CCV number</field>
				<field id="generic-pin">PIN</field>
			</entry>
		</entry>
 
		<entry type="email">
			<name>Email name</name>
			<description>Email description</description>
			<updated>1153821003</updated>
			<field id="generic-email">Email</field>
			<field id="generic-hostname">hostname</field>
			<field id="generic-username">username</field>
			<field id="generic-password">password</field>
		</entry>
 
	</entry>
</revelationdata>

Az XML állomány kezeléséhez kapcsolódó C# osztály kódja:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections;
using System.IO;
using System.Text;
 
namespace PocketRevelation
{
	[XmlRoot ("revelationdata")]
	public class RevelationData
	{
		[XmlElement ("entry", Type = typeof (Entry))]
		public ArrayList  Entries;
		[XmlAttribute ("version")]
		public string     Version;
		[XmlAttribute ("dataversion")]
		public int        DataVersion;
 
		public RevelationData ()
		{
			Entries = new ArrayList ();
		}
 
		public byte[] Serialize ()
		{
			XmlSerializer xmlSerializer = new XmlSerializer (typeof (RevelationData));
			MemoryStream memoryStream = new MemoryStream ();
			xmlSerializer.Serialize (memoryStream, this);
			byte[] serializedXml = memoryStream.GetBuffer ();
			memoryStream.Close ();
			return serializedXml;
		}
 
		public static RevelationData Deserialize (string xmlFileName)
		{
			byte[] buffer = new byte[1024];
			FileStream fileStream;
			try {
				fileStream = File.OpenRead (xmlFileName);
			}
			catch (Exception e) {
				throw new FileNotFoundException(e.Message);
			}
			MemoryStream memoryStream = new MemoryStream ();
			while (true)
			{
				int cbRead = fileStream.Read (buffer, 0, buffer.Length);
				if (cbRead <= 0)
					break;
				memoryStream.Write (buffer, 0, cbRead);
			}
			memoryStream.Position = 0;
 
			XmlSerializer xmlSerializer = new XmlSerializer (typeof (RevelationData));
			RevelationData revelationData = (RevelationData) xmlSerializer.Deserialize (memoryStream);
			memoryStream.Close ();
			fileStream.Close ();
			return revelationData;
		}
	}
 
	public class Entry
	{
		[XmlIgnoreAttribute]
		private static readonly DateTime MinValue = new DateTime(1970, 1, 1);
 
		[XmlElement ("name")]
		public string		Name;
		[XmlElement ("description")]
		public string		Description;
		[XmlIgnoreAttribute]
		public DateTime		Updated;
		[XmlAttribute ("type")]
		public string		Type;
		[XmlElement ("field", Type = typeof (Field))]
		public ArrayList	Fields;
		[XmlElement ("entry", Type = typeof (Entry))]
		public ArrayList	Childs;
 
		[XmlElement ("updated")]
		public long	UpdatedLong {
			get { return (long)(Updated - MinValue).TotalSeconds; }
			set { Updated = MinValue + new TimeSpan (value * TimeSpan.TicksPerSecond); }
		}
 
		public Entry()
		{
			Fields = new ArrayList ();
			Childs = new ArrayList ();
		}
	}
 
	public class Field
	{
	    	[XmlAttribute ("id")]
		public string		Id;
		[XmlTextAttribute]
		public string		Value;
	}
 
	public class RevelationDatabase
	{
		private string            _xmlFileName;
		private RevelationData    _revelationData;
 
		public string filename {
			get { return _xmlFileName; }
			set { _xmlFileName = value; }
		}
 
		public RevelationData revelationData {
			get { return _revelationData; }
		}
 
		public RevelationDatabase (string filename)
		{
			_xmlFileName = filename;
			_revelationData = new RevelationData ();
		}
 
		public void Load ()
		{
			_revelationData = RevelationData.Deserialize (_xmlFileName);
		}
	}
}
Tagged with:
 

MINDEN VÉLEMÉNY SZÁMÍT!

Email cím (nem tesszük közzé) A kötelezően kitöltendő mezőket * karakterrel jelöljük

*

A következő HTML tag-ek és tulajdonságok használata engedélyezett: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">