vbali blogja
XML serialization
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);
}
}
}
Fotók


