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