This suggests that you have solved a hard problem in a hopefully-reusable way.  
Can you make the code available, or give us an example of how you've solved it 
using only documented behavior?

Well, the code is identical to the one I posted before, with the only
change being that MultitonSerializationHelper now implements
ISerializable in order to read its state. I'll repost it below with a
slightly modified test driver.

Fabian

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

namespace Serialization {
   [Serializable]
   public sealed class Multiton : ISerializable {
       public enum Kind { Undefined, One, Two }

       public static Multiton Instance1 = new Multiton(Kind.One);
       public static Multiton Instance2 = new Multiton(Kind.Two);

       public readonly Kind MyKind;

       private Multiton(Kind kind) {
           this.MyKind = kind;
       }

       // other constructor needs not be implemented,
       // it's never called

       public void GetObjectData(SerializationInfo info,
StreamingContext context) {
           info.SetType(typeof(MultitonSerializationHelper));
           info.AddValue("kind", MyKind);
       }
   }

   [Serializable]
   class MultitonSerializationHelper : IObjectReference, ISerializable {
       public Multiton.Kind kind = Multiton.Kind.Undefined;

       public MultitonSerializationHelper(SerializationInfo info,
StreamingContext context) {
           this.kind = (Multiton.Kind)info.GetValue("kind",
typeof(Multiton.Kind));
       }

       void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context) {
           // this is never called
           throw new NotImplementedException("This should never be called.");
       }

       public object GetRealObject(StreamingContext context) {
           switch (kind) {
               case Multiton.Kind.One:
                   return Multiton.Instance1;
               case Multiton.Kind.Two:
                   return Multiton.Instance2;
               default:
                   throw new Exception("object undefined!");
           }
       }
   }

   class Program {
       static void Main(string[] args) {
           BinaryFormatter formatter = new BinaryFormatter();
           byte[] data;

           using (MemoryStream stream = new MemoryStream()) {
               formatter.Serialize(stream, new Multiton[] {
                   Multiton.Instance2,
                   Multiton.Instance1,
                   Multiton.Instance1,
                   Multiton.Instance2});
               data = stream.GetBuffer();
           }

           using (MemoryStream stream = new MemoryStream(data)) {
               Multiton[] multitons =
(Multiton[])formatter.Deserialize(stream);
               foreach (Multiton mt in multitons) {
                   if (object.ReferenceEquals(mt, Multiton.Instance1)) {
                       Console.Write("1 ");
                   }
                   else if (object.ReferenceEquals(mt, Multiton.Instance2)) {
                       Console.Write("2 ");
                   }
                   else {
                       Console.Write("? ");
                   }
               }
           }
           Console.WriteLine();
       }
   }
}

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to