Bem, há momentos em que você descreve pode ser uma abordagem muito ruim. Isso pressupõe que, quando você diz 'serializar', está falando sobre o uso da capacidade de uma linguagem / estrutura para simplesmente pegar um objeto e enviar diretamente para algum tipo de fluxo binário. O problema é que as estruturas de classes mudam ao longo dos anos. Você poderá recarregar um arquivo criado em uma versão anterior do seu aplicativo se todas as suas classes mudarem para uma mais nova?
Para estabilidade a longo prazo de um formato de arquivo, achei melhor arregaçar as mangas agora e escrever especificamente seus próprios métodos de 'serialização' / 'streaming' dentro de suas classes. ou seja, manipule manualmente a gravação de valores em um fluxo. Escreva um cabeçalho como você descreve, descrevendo a versão do formato e, em seguida, os dados que você deseja salvar na ordem em que deseja. No lado da leitura, manipular versões diferentes do formato do arquivo fica muito mais fácil.
A outra opção, é claro, é XML ou JSON. Não necessariamente o melhor para conteúdo pesado binário, mas simples e legível por humanos ... uma grande vantagem para a viabilidade a longo prazo.
BinaryFormatter
.