Ask a questionAsk a question
 

QuestionBug using a Serialization Surrogate

  • Sunday, January 08, 2006 5:22 PMMauro Sturaro Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     

    Using also a very simple implementation of Serialization Surrogate the deserialization fail, if there is a forward reference, with a SerializationException and a message:

       "The object with ID 1 was referenced in a fixup but does not exist."

    this is a sample to see the bug:

    Can anyone tell me if I'm wrong or confirm the error.

    Also any workaround are welcome.

    ------------
    using System;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Reflection;
    
    namespace SerializationTest {
        static class Program {
    
            [STAThread]
            static void Main() {
                MyClass ci = new MyClass();
                ci.Name = "test1";
                ci.RelatedClass = ci;
                MemoryStream stream = new MemoryStream();
                Save(ci, stream);
                ci = null;
                stream.Position = 0;
                ci = Load(stream);  // This throw a SerializationException
                Console.WriteLine(ci.Name);
                stream.Close();
            }
    
            static void Save(MyClass app, Stream stream) {
                IFormatter myFrmt = new BinaryFormatter();
    
                SurrogateSelector ss = new SurrogateSelector();
                ss.AddSurrogate(typeof(MyClass), myFrmt.Context, new MySerializationSurrogate());
                myFrmt.SurrogateSelector = ss;
    
                myFrmt.Serialize(stream, app);
            }
    
            static MyClass Load(Stream stream) {
                IFormatter myFrmt = new BinaryFormatter();
    
                SurrogateSelector ss = new SurrogateSelector();
                ss.AddSurrogate(typeof(MyClass), myFrmt.Context, new MySerializationSurrogate());
                myFrmt.SurrogateSelector = ss;
    
                MyClass app = (MyClass)myFrmt.Deserialize(stream);
                return app;
            }
        }
    
        [Serializable]
        class MyClass {
            public MyClass RelatedClass;
            public string Name;
        }
    
        public class MySerializationSurrogate : ISerializationSurrogate {
    
            public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) {
                MyClass myClass = (MyClass)obj;
                info.AddValue("Name", myClass.Name);
                info.AddValue("RelatedClass", myClass.RelatedClass);
            }
    
            public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) {
                MyClass myClass = (MyClass)obj;
                myClass.Name = info.GetString("Name");
                myClass.RelatedClass = (MyClass)info.GetValue("RelatedClass", typeof(MyClass));
                return myClass;
            }
        }
    }
    

    Mauro Sturaro

All Replies