SurrogateSelector Class
Assists formatters in selection of the serialization surrogate to delegate the serialization or deserialization process to.
Assembly: mscorlib (in mscorlib.dll)
System.Runtime.Serialization::SurrogateSelector
System.Workflow.ComponentModel.Serialization::ActivitySurrogateSelector
| Name | Description | |
|---|---|---|
![]() | SurrogateSelector() | Initializes a new instance of the SurrogateSelector class. |
| Name | Description | |
|---|---|---|
![]() | AddSurrogate(Type^, StreamingContext, ISerializationSurrogate^) | Adds a surrogate to the list of checked surrogates. |
![]() | ChainSelector(ISurrogateSelector^) | Adds the specified ISurrogateSelector that can handle a particular object type to the list of surrogates. |
![]() | Equals(Object^) | Determines whether the specified object is equal to the current object.(Inherited from Object.) |
![]() | Finalize() | Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.(Inherited from Object.) |
![]() | GetHashCode() | Serves as the default hash function. (Inherited from Object.) |
![]() | GetNextSelector() | Returns the next selector on the chain of selectors. |
![]() | GetSurrogate(Type^, StreamingContext, ISurrogateSelector^%) | Returns the surrogate for a particular type. |
![]() | GetType() | |
![]() | MemberwiseClone() | |
![]() | RemoveSurrogate(Type^, StreamingContext) | Removes the surrogate associated with a given type. |
![]() | ToString() | Returns a string that represents the current object.(Inherited from Object.) |
A serialization surrogate gives the users an object that can handle the serialization requirements of a different object and can transform the serialized data if necessary.
The following code example shows how to make a serialization surrogate class that knows how to properly serialize or deserialize a class that is not itself serializable. In addition, this example also shows how to recover from a SerializationException.
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Serialization.Formatters.Binary; // This class is not serializable. class Employee { public String name, address; public Employee(String name, String address) { this.name = name; this.address = address; } } // This class can manually serialize an Employee object. sealed class EmployeeSerializationSurrogate : ISerializationSurrogate { // Serialize the Employee object to save the object�s name and address fields. public void GetObjectData(Object obj, SerializationInfo info, StreamingContext context) { Employee emp = (Employee) obj; info.AddValue("name", emp.name); info.AddValue("address", emp.address); } // Deserialize the Employee object to set the object�s name and address fields. public Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { Employee emp = (Employee) obj; emp.name = info.GetString("name"); emp.address = info.GetString("address"); return null; } } public sealed class App { static void Main() { // This sample uses the BinaryFormatter. IFormatter formatter = new BinaryFormatter(); // Create a MemoryStream that the object will be serialized into and deserialized from. using (Stream stream = new MemoryStream()) { // Create a SurrogateSelector. SurrogateSelector ss = new SurrogateSelector(); // Tell the SurrogateSelector that Employee objects are serialized and deserialized // using the EmployeeSerializationSurrogate object. ss.AddSurrogate(typeof(Employee), new StreamingContext(StreamingContextStates.All), new EmployeeSerializationSurrogate()); // Associate the SurrogateSelector with the BinaryFormatter. formatter.SurrogateSelector = ss; try { // Serialize an Employee object into the memory stream. formatter.Serialize(stream, new Employee("Jeff", "1 Microsoft Way")); } catch (SerializationException e) { Console.WriteLine("Serialization failed: {0}", e.Message); throw; } // Rewind the MemoryStream. stream.Position = 0; try { // Deserialize the Employee object from the memory stream. Employee emp = (Employee) formatter.Deserialize(stream); // Verify that it all worked. Console.WriteLine("Name = {0}, Address = {1}", emp.name, emp.address); } catch (SerializationException e) { Console.WriteLine("Deserialization failed: {0}", e.Message); throw; } } } } // This code produces the following output. // // Name = Jeff, Address = 1 Microsoft Way
Available since 1.1
Any public static ( Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

