В принципе, если я отмечу свои классы как [DataContract], могу ли я написать свой собственный сериализатор, который расширяется от XmlObjectSerializer, который возвращает двоичный файл таким же образом, как если бы я сделал [Serializable]?
[DataContract]
[Serializable]
Да, вы можете, но помните, что сериализатор, если наследуется от XmlObjectSerializer, будет иметь дело с XML. Какой писатель / читатель XML вы используете, будет определять, используете ли вы двоичное представление или нет. Один «двоичный» XML-ридер / писатель - это тот, который создан XmlDictionaryReader.CreateBinaryReader и XmlDictionaryWriter.CreateBinaryWriter.
XmlObjectSerializer
XmlDictionaryReader.CreateBinaryReader
XmlDictionaryWriter.CreateBinaryWriter
Сообщение в http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/29/wcf-extensibility-icontractbehavior.aspx содержит пример, показывающий пользовательский XmlObjectSerializer, который при использовании с бинарным модулем записи XML может сериализовать объекты до довольно небольшого размера.