Ako na serializáciu v C#
Ak pracujete s väčším množstvom dát, môže byť niekedy výhodne si tieto dáta uložiť do súboru na neskoršie spracovanie. Príkladom takého využitia môže byť napríklad export dát z LDAP do súboru a až následné spracovanie dát z tohto súboru. Takýmto spôsobom je možné získať dáta čo najrýchlejšie a zaťažiť LDAP na čo najkratšiu dobu a následne ich spracovať. Práve na takéto operácie je ideálna serializácia, ktorá umožňuje jednoduché uloženie a načítanie celých objektov do (z) súboru.
Každú triedu, ktorej inštancie chcete serializovať musíte označiť atribútom Serializable a implementovať rozhranie ISerializable:
[Serializable]
public class LdapCompany : ISerializable
{
public string dxrUid { get; set; }
public string DN { get; set; }
public string Name { get; set; }
public LdapCompany()
{
}
#region ISerializable Members
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("dxrUid", this.dxrUid);
info.AddValue("DN", this.DN);
info.AddValue("Name", this.Name);
}
public LdapCompany(SerializationInfo info, StreamingContext ctxt)
{
this.dxrUid = (string)info.GetValue("dxrUid", typeof(string));
this.DN = (string)info.GetValue("DN", typeof(string));
this.Name = (string)info.GetValue("Name", typeof(string));
}
#endregion
}
Ak chcete serializovať viac ako len jdenu triedu, je výhodné vytvoriť si ďalšiu triedu, ktorá bude obsahovať všetky inštancie tried, ktoré chcete serializovať a sama bude serializovaná.
[Serializable()]
public class ObjectToSerialize : ISerializable
{
...
public List≶LdapCompany> companies;
public ObjectToSerialize()
{
}
public ObjectToSerialize(SerializationInfo info, StreamingContext ctxt)
{
...
this.companies = (List<LdapCompany>)info.GetValue("companies", typeof(List<LdapCompany>));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
...
info.AddValue("companies", this.companies);
}
}
Na súborovú serializáciu je potrené využiť ďalšiu triedu, ktoré bude inštancie triedy ObjectToSerialize serializovať (deserializovať) do (z) súboru.
public class Serializer
{
public Serializer()
{
}
public void SerializeObject(string filename, ObjectToSerialize objectToSerialize)
{
Stream stream = File.Open(filename, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Close();
}
public ObjectToSerialize DeSerializeObject(string filename)
{
ObjectToSerialize objectToSerialize;
Stream stream = File.Open(filename, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
objectToSerialize = (ObjectToSerialize)bFormatter.Deserialize(stream);
stream.Close();
return objectToSerialize;
}
}
Samotná serializácia je už potom naozaj jednoduchá
ObjectToSerialize objectToSerialize = new ObjectToSerialize();
objectToSerialize.companies = ...
...
Serializer s = new Serializer();
s.SerializeObject(@"file.txt", objectToSerialize);
rovnako ako aj deserializácia
Serializer serializer = new Serializer();
objectToSerialize = serializer.DeSerializeObject(@"file.txt");
...