Serialization surrogates (Implementing C# with Example
ISerializationSurrogate) Implements a serialization surrogate selector that allows one object to perform serialization and deserialization of another As well allows to properly serialize or deserialize a class that is not itself serializable Implement ISerializationSurrogate interface public class ItemSurrogate : ISerializationSurrogate { public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) { var item = (Item)obj; info.AddValue("_name", item.Name); } public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { var item = (Item)obj; item.Name = (string)info.GetValue("_name", typeof(string)); return item; } } Then you need to let your IFormatter know about the surrogates by defining and initializing a SurrogateSelector and assigning it to your IFormatter var surrogateSelector = new SurrogateSelector(); surrogateSelector.AddSurrogate(typeof(Item), new StreamingContext(StreamingContextStates.All), new ItemSurrogate()); var binaryFormatter = new BinaryFormatter { SurrogateSelector = surrogateSelector }; Even if the class is not marked serializable. //this class is not serializable public class Item { private string _name; public string Name { get { return _name; } set { _name = value; } } } The complete solution using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace BinarySerializationExample { class Item { private string _name; public string Name { get { return _name; } set { _name = value; } } } class ItemSurrogate : ISerializationSurrogate { public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) { var item = (Item)obj; info.AddValue("_name", item.Name); } public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { var item = (Item)obj; item.Name = (string)info.GetValue("_name", typeof(string)); return item; } } class Program { static void Main(string[] args) { var item = new Item { Name = "Orange" }; var bytes = SerializeData(item); var deserializedData = (Item)DeserializeData(bytes); } private static byte[] SerializeData(object obj) { var surrogateSelector = new SurrogateSelector(); surrogateSelector.AddSurrogate(typeof(Item), new StreamingContext(StreamingContextStates.All), new ItemSurrogate()); var binaryFormatter = new BinaryFormatter { SurrogateSelector = surrogateSelector }; using (var memoryStream = new MemoryStream()) { binaryFormatter.Serialize(memoryStream, obj); return memoryStream.ToArray(); } } private static object DeserializeData(byte[] bytes) { var surrogateSelector = new SurrogateSelector(); surrogateSelector.AddSurrogate(typeof(Item), new StreamingContext(StreamingContextStates.All), new ItemSurrogate()); var binaryFormatter = new BinaryFormatter { SurrogateSelector = surrogateSelector }; using (var memoryStream = new MemoryStream(bytes)) return binaryFormatter.Deserialize(memoryStream); } } }