Fixed it. It turns out, fields are serialised before properties and my code was actually like this:
[Serializable]
public class Request
{
[XmlElement("Type")]
public string Type
{
get;
set;
}
[XmlElement("Id")]
public int Id; // <<<--- Note this is a field, not a property
}