[System.Serializable] public class ClassA { public string name; public ClassB a; public ClassA() { name = "Class A Instance"; a = new ClassB(); a.name = "Class B Instance"; } } [System.Serializable] public class ClassB { public string name; } public class ClassASurrogate : ISerializationSurrogate { public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) { ClassA o = (ClassA)obj; info.AddValue("n", o.name); info.AddValue("cB",o.a); } public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { ClassA o = (ClassA)obj; o.name = (string)info.GetValue("n", typeof(string)); //o.a = (ClassB)info.GetValue("cB", typeof(ClassB)); return o; } } public class ClassBSurrogate : ISerializationSurrogate { public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) { ClassB o = (ClassB)obj; info.AddValue("n", o.name); } public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { ClassB o = (ClassB)obj; o.name = (string)info.GetValue("n", typeof(string)); return o; } }Tested using
ClassA oo = new ClassA(); BinaryFormatter b = new BinaryFormatter(); SurrogateSelector ss = new SurrogateSelector(); ClassASurrogate cas = new ClassASurrogate(); ss.AddSurrogate(typeof(ClassA), new StreamingContext(StreamingContextStates.All), cas); ClassBSurrogate cbs = new ClassBSurrogate(); ss.AddSurrogate(typeof(ClassB), new StreamingContext(StreamingContextStates.All), cbs); b.SurrogateSelector = ss; MemoryStream m = new MemoryStream(); b.Serialize(m, oo); m.Position = 0; ClassA again = (ClassA)b.Deserialize(m);Best,