using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public static void Main()
var outer = new Outer{Inners = new List<Inner>{new Inner()}};
Console.WriteLine("Original: " + outer.Inners[0]);
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
formatter.Serialize(stream, outer);
copiedOuter = (Outer)formatter.Deserialize(stream);
Console.WriteLine("Copy: " + copiedOuter.Inners[0]);
public class Outer : ISerializable
public List<Inner> Inners { get; set; }
private Outer(SerializationInfo info, StreamingContext context)
Inners = new List<Inner>((IList<Inner>) info.GetValue("", typeof(IList<Inner>)));
Console.WriteLine(info.GetString("testOuter"));
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
info.AddValue("", Inners);
info.AddValue("testOuter", "from outer");
public class Inner : ISerializable
private Inner(SerializationInfo info, StreamingContext context)
Console.WriteLine(info.GetString("testInner"));
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
info.AddValue("testInner", "from inner");