tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
1497
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    
    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 :
    1
    2
    
    True
    False
    ...
    entfernt man die Kommentare bekommt man die gewünschte Ausgabe:
    Code :
    1
    2
    
    True
    True

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  2. #2
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    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!
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Zitat Zitat von Thomas Darimont Beitrag anzeigen
    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
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

Ähnliche Themen

  1. Antworten: 7
    Letzter Beitrag: 24.02.10, 13:57
  2. Eines Beispiel zum Remoting mit WCF über HTTP
    Von Thomas Darimont im Forum .NET Web und Kommunikation
    Antworten: 0
    Letzter Beitrag: 27.11.08, 11:47
  3. Kleines Beispiel für die Verwendung eines java Beans in einer JSP
    Von Thomas Darimont im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 27.08.08, 21:30
  4. Beispiel eines ADT (verwirrt mich)
    Von Razorhawk im Forum Java
    Antworten: 1
    Letzter Beitrag: 01.02.06, 13:34
  5. Antworten: 2
    Letzter Beitrag: 13.09.05, 15:42