Igor Kulman

Ako na serializáciu v C#

· Igor Kulman

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");
...