Хорошо, у меня один из тех дней, когда я продолжаю отвечать на себя. Проблема не в десериализации, а в сериализации - вы должны создать сериализатор с тем же базовым типом, что и десериализатор (я создал сериализатор на основе дочернего типа). Для чего это стоит, рабочий код ниже:
{
var child = new Child();
// here is where I went wrong before -- I used typeof(Child), with no known types to serialize
var serializer = new DataContractSerializer(typeof(Parent), new Type[] { typeof(Child) });
var stream = new MemoryStream();
serializer.WriteObject(stream, child);
stream.Position = 0;
serializer = new DataContractSerializer(typeof(Parent), new Type[] { typeof(Child) });
object test = serializer.ReadObject(stream);
stream.Dispose();
Console.WriteLine(test.ToString());
Console.ReadLine();
}