Armazenando e mantendo objetos serializados em C #

8

Quais são as práticas recomendadas para armazenar e manter objetos serializados em C #? Alguma estratégia ou padrão que se aplique?

O que eu acredito até agora é o seguinte:

  • Prefira Json sobre XML, tanto por espaço quanto por velocidade, mas é mais fácil consultar xml / extrair dados via LINQ to XML para conjuntos de dados maiores.
  • Para cada propriedade, mapeie explicitamente para um nome serializado. No futuro, quando você precisar renomear uma propriedade, seus dados serializados não serão interrompidos. Atributos ajudam com isso.
  • Armazene algum tipo de informação de versão no objeto serializado, caso você precise migrar dados em massa no futuro

Atualização: (que eu descobri da maneira mais difícil)

  • Armazene todas as datas de maneira uniforme em todo o aplicativo e em todas as versões. Tanto em relação ao formato quanto ao fuso horário.
Mihalis Bagos
fonte
Quais operações serão realizadas nesses dados serializados? Somente leitura / gravação ou algo mais complexo?
Euphoric
É uma pergunta mais geral, mas, no meu caso, preciso armazenar objetos de configurações pequenas que podem ou não ser atualizadas.
Mihalis Bagos
2
4. Siga as regras até que faça mais sentido violá-las.
Robert Harvey
1
O que você quer dizer? Quais são "as regras" neste caso?
Mihalis Bagos

Respostas:

9

Eu fiz bastante serialização ao longo dos anos. Aqui estão algumas coisas que criamos:

  • Prefira formatos legíveis por humanos sobre formatos binários. Geralmente, prefiro o Xml ao Json, principalmente porque você pode usar o Xslt para transformar o Xml quando precisar atualizar a versão.

  • Seja lá o que você estiver serializando, a lógica de desserialização e o armazenamento de dados devem permitir a versão dos dados serializados. As informações da versão provavelmente devem estar fora dos dados serializados, facilitam um pouco o acesso e a escolha da estratégia de desserialização correta.

  • Sua serialização deve ter testes de unidade em execução nos dois sentidos. IE, você deve fazer um teste para desserializar os dados e confirmar que tudo foi importado corretamente. E você deve ter algo que serialize os dados e confirme se eles são os json e xml corretos.

  • Se o ponto da referida serialização for multiplataforma, teste contra a outra plataforma. Provavelmente não há tanto problema agora quanto as plataformas amadureceram, mas houve momentos em que as coisas não concordavam sobre como o json deveria ser formatado.

Wyatt Barnett
fonte
4

Os pontos mencionados são práticos e é bom ter em mente. Gostaria de mencionar diferentes tipos de serializações que podem ser úteis, dependendo das necessidades de seu aplicativo.

  • Serialização binária - usa codificação binária para produzir serialização compacta para usos como storageou socket-based network fluxos.
  • Serialização XML - serializa os campos e propriedades públicos de um objeto, ou os parâmetros e valores de retorno dos métodos, em um fluxo XML que esteja em conformidade com um documento específico da linguagem de definição de esquema XML (XSD). Mais informações estão disponíveis no espaço para nome System.Xml.Serialization .
  • Serialização SOAP - é um tipo diferente de serialização XML, onde pode ser usado para serializar objetos em fluxos XML que estão em conformidade com a especificação SOAP. SOAP é um protocolo baseado em XML, projetado especificamente para transportar chamadas de procedimento usando XML. Como na serialização XML regular, os atributos podem ser usados ​​para controlar as mensagens SOAP de estilo literal geradas por um serviço da Web XML.

Mais informações de fonte oficial - programação MSDN C #

Além disso, tudo isso precisa ser práticas dentro do processo SDLC (ou seja, ter ambiente para testar, controle de versão etc.)

Yusubov
fonte
Por que você gostaria de armazenar como binário ou sabão? Até onde eu sei, o sabão é exagerado, a fim de evitar a corrupção de dados, algo que não é problema ao armazenar em um sistema conhecido.
Mihalis Bagos
1
trata-se de velocidade, o mais rápido é a serialização binária.
Yusubov 25/07/2012
O BinaryFormatter também é a opção menos tolerante a alterações. Tivemos inúmeras lutas com ele e agora desejamos nunca usá-lo. Veja: stackoverflow.com/a/703361/505697
HappyCat
com certeza, tudo tem seus próprios problemas e depende de onde é usado. como mencionado, para compatibilidade entre plataformas, não é uma opção ideal; é aqui que a serialização XML entra em cena.
Yusubov