Serialization surrogates (Implementing C# with Example



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); 
} 
} 
} 

0 Comment's

Comment Form

Submit Comment