July 2005
Intermediate to advanced
644 pages
17h
English
Using a file stream isn’t mandatory—you can serialize an object’s state into any type of stream, such as a network or memory stream. Example 9-12 demonstrates how to serialize and deserialize an object to and from a memory stream, using the same definitions as in Example 9-4.
Example 9-12. Serialization and deserialization using a memory stream
MyClass obj = new MyClass(); obj.Number1 = 123; IGenericFormatter formatter = new GenericBinaryFormatter(); //Create a memory stream Stream stream = new MemoryStream(); using(stream) { formatter.Serialize(stream,obj); obj = null; stream.Position = 0 ; //Seek to the start of the memory stream obj = formatter.Deserialize<MyClass>(stream); } Debug.Assert(obj.Number1 == 123);
.NET remoting uses a memory stream when marshaling an object by value across app domains. Marshaling by value is covered in Chapter 10.
You can actually use a memory stream to clone a serializable object, too. Example 9-13 shows the static Clone() method of the SerializationUtil static helper class.
Example 9-13. Cloning a serializable object
public static class SerializationUtil
{
static public T Clone<T>(T source)
{
Debug.Assert(typeof(T).IsSerializable);
IGenericFormatter formatter = new GenericBinaryFormatter();
Stream stream = new MemoryStream();
using(stream)
{
formatter.Serialize(stream,source);
stream.Seek(0,SeekOrigin.Begin);
T clone = formatter.Deserialize<T>(stream);
return clone;
}
}
//Rest of SerializationUtil
}The Clone() method first ...