Benutzerdefinierte Serialisierung am Beispiel eines Singletons

Thomas Darimont

Erfahrenes Mitglied
Hallo,

in .Net hat man die Möglichkeit über System.Runtime.Serialization.IObjectReference in Verbindung mit
System.Runtime.Serialization.SerializationInfo-> SetType(...) die (De)Serialisierung eines Types zu beinflussen.

Hat man beispielsweise ein Singleton (oder ein Objekt welches dieses Singleton Referenziert) Serialisiert dieses und Deserialisiert es anschließend wieder so hat man per default ZWEI unterschiedliche Instanzen dieses Singletons (da über interne Mechanismen der Serialisierung ein neue Singleton Instanz gebaut wird).

Da man aber bei der Deserialisierung eines Singletons gern eine Referenz auf das selbe Singleton haben will das gerade im aktuellen Kontext lebt, kann man dies über eine entsprechende Benutzerdefinierte Serialisierung erreichen.

Wie im folgenden Beispiel gezeigt:
C#:
using System;
using System.Collections.Generic;
using System.Text;

using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace De.Tutorials.Training
{
    public class CustomSerializationExample
    {
        public static void Main(string[] args)
        {
            Singleton singletonA = Singleton.Instance;
            Singleton singletonB = Singleton.Instance;

            Console.WriteLine(singletonA == singletonB);

            MemoryStream memoryStream = new MemoryStream();
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            binaryFormatter.Serialize(memoryStream, singletonB);

            memoryStream.Position = 0;

            Singleton singletonBB = (Singleton)binaryFormatter.Deserialize(memoryStream);

            Console.WriteLine((singletonBB == singletonB) && (singletonBB== singletonA));
        }
    }

    [Serializable()]
        public class Singleton 
        //: ISerializable
    {
        private static readonly Singleton instance = new Singleton();
        public static Singleton Instance
        {
            get { return instance;  }
        }

        //#region ISerializable Member
        //public void GetObjectData(SerializationInfo info, StreamingContext context)
        //{
        //    info.SetType(typeof(SingletonReference));
        //}
        //#endregion
    }

    [Serializable()]
    public class SingletonReference : IObjectReference
    {
        #region IObjectReference Member
        public object GetRealObject(StreamingContext context)
        {
            return Singleton.Instance;
        }
        #endregion
    }
}

Ausgabe:
Code:
True
False
...
entfernt man die Kommentare bekommt man die gewünschte Ausgabe:
Code:
True
True

Gruß Tom
 
Hi Tom!

Finde ich sehr umständlich, sofern man mehrere Referenzen behalten will.
Es gibt auf TheCodeProject ein nettes Projekt. AltSerializer - An Alternate Binary Serializer
Dieser Serializer arbeitet schneller und viel effizienter als der Framework serializer und er speichert vor allem Referenzen automatisch.
Wenn man da noch ein explizites TypeCaching einbaut und den Serialisierprozess selber via ISerializable beeinflusst, kann man sogar die Versionierung völlig umschiffen! :)
 
Hallo,

Finde ich sehr umständlich, sofern man mehrere Referenzen behalten will.
Es gibt auf TheCodeProject ein nettes Projekt. AltSerializer - An Alternate Binary Serializer
Dieser Serializer arbeitet schneller und viel effizienter als der Framework serializer und er speichert vor allem Referenzen automatisch.
Wenn man da noch ein explizites TypeCaching einbaut und den Serialisierprozess selber via ISerializable beeinflusst, kann man sogar die Versionierung völlig umschiffen! :)
Es ging in dem Beispiel einzig und allein darum die Möglichkeiten der Benutzerdefinierte Serialisierung der Standard .Net Serialisierung anhand des Sonderfalls der Behandlung eines Singletons bei der Serialisierung zu demonstrieren :p

Gruß Tom
 
Es ging in dem Beispiel einzig und allein darum die Möglichkeiten der Benutzerdefinierte Serialisierung der Standard .Net Serialisierung anhand des Sonderfalls der Behandlung eines Singletons bei der Serialisierung zu demonstrieren :p
Bei meinem Post ging es einzig und allein darum, alternative und effizientere Techniken der benutzerdefinierten Serialisierung aufzuzeigen, bei der zudem alle Objektreferenzen beibehalten werden, ohne dabei einen Mehraufwand an Implementationen aufwenden zu müssen. :p

LG, cosmo
 
Zurück