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:
Ausgabe:
...
entfernt man die Kommentare bekommt man die gewünschte Ausgabe:
Gruß Tom
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