Serializando objetos de transferência de dados no .NET
Eu tenho um conjunto de objetos de transferência de dados (por exemplo, muitas solicitações e classes de mensagens de resposta, como MainRequest, MainResponse, ShutDownRequest, ShutDownResponse)Onde novas classes continuam chegando à medida que o projeto evolui. Essas classes devem ser (des) serializadas de e paravários formatos XML com diferentes XSDs públicos. Novos formatos XML surgem à medida que o projeto também evolui.
Minha pergunta aqui é como eu projetaria minhas classes e interfaces em torno deestes dois requisitos, especialmente onde devo colocar a lógica real de (des) serilização. Devo escrever um serviço estático que possa levar as várias instâncias de DTO e saber serializar cada uma delas? Quando novas classes chegam, preciso tocar em cada FormatXSeriaizer e adicionar novas substituições. À medida que novos formatos chegam, eu apenas tenho que escrever novas classes FormatXSerializer.
FormatASerializer.Serialize(XmlWriter writer, MainResponse r);
FormatASerializer.Serialize(XmlWriter writer, ShutDownResponse r);
FormatBSerializer.Serialize(XmlWriter writer, MainResponse r);
FormatBSerializer.Serialize(XmlWriter writer, ShutDownResponse r);
ou os DTOs devem saber como fazê-lo. Então, eu tenho tudo em um só lugar - para cada classe de DTO. À medida que novas classes de DTO chegam, elas apenas precisam implementar a serialização para os vários formatos. À medida que novos formatos chegam, tenho que tocar em cada classe de DTO.
myMainRequestInstace.Serialize(FormatTypeEnum type, XmlWriter writer);
Ou existe uma abordagem completamente diferente? Devo introduzir uma interface comum para serialização e ter alguma inversão de controle, para poder carregar novos serializadores de formato em tempo de execução?
Que padrão de design pode me guiar aqui?
Que código-fonte aberto no mundo .NET eu poderia estudar para ver abordagens diferentes sobre esse assunto?
Edição: Eu sei sobre as técnicas gerais de serialização existentes no quadro. Minha pergunta é mais voltada para o design de classe que respeita os dois requisitos: vários formatos xml e vários DTOs (tipos de mensagem) que continuam surgindo à medida que o projeto evolui.