Pergunta

Eu gastei uma parte boa de tempo na semana passada trabalhando em serialização. Durante esse tempo eu encontrei muitos exemplos que utilizam tanto o BinaryFormatter ou XmlSerializer. Infelizmente, o que eu não encontrei foram alguns exemplos de forma abrangente detalhando as diferenças entre os dois.

A gênese de minhas mentiras curiosidade em saber por que o BinaryFormatter é capaz de desserializar diretamente a uma interface enquanto o XmlSerializer não é. Jon Skeet em uma resposta a " converter para múltiplo (tipos desconhecidos) em tempo de execução " fornece um exemplo de serialização binária direta a uma interface. Stan R. me proporcionou os meios de realizar minha meta usando o XmlSerializer em sua resposta à pergunta "XML objeto Deserialization a interface ."

Para além do óbvio do BinaryFormatter utiliza serialização binária enquanto o XmlSerializer usa XML Eu gostaria de entender melhor as diferenças fundamentais. Quando usar um ou o outro e os prós e contras de cada um.

Foi útil?

Solução

A razão de um formatador binário é capaz de desserializá directamente para um tipo de interface é porque quando um objecto for colocado em série originalmente para um fluxo binário de metadados contendo tipo e conjunto de informação é preso em com os dados de objecto. Isto significa que quando o formatador binário desserializa o objeto que ele sabe o seu tipo, constrói o objeto correto e então você pode elenco que para um tipo de interface que implementa objetos.

O serializador XML no otherhand apenas serializa a um esquema e apenas serializa os campos públicos e os valores do objeto e nenhuma informação do tipo outros, então, que (por exemplo, interfaces dos implementos do tipo).

Aqui está um bom post, .NET serialização , comparando o BinaryFormatter , SoapFormatter , e XmlSerializer . Eu recomendo que você olhar para a tabela a seguir, que, além dos serializers mencionados anteriormente inclui o DataContractSerializer , NetDataContractSerializer e protobuf-net .

serialização Comparação

Outras dicas

Apenas a pesar ...

A diferença óbvia entre os dois é "binário vs xml", mas ele faz ir muito mais profundo do que isso:

  • campos (BinaryFormatter = bf) vs public membros (tipicamente propriedades) (XmlSerializer = xs)
  • tipo de metadados com base (bf) vs baseada em contrato (xs)
  • Versão-frágil (bf) vs versão tolerante (xs)
  • "gráfico" (bf) vs "árvore" (xs)
  • específico .NET (bf) vs portáteis (xs)
  • opaco (bf) vs legível (xs)

Como uma discussão sobre por que BinaryFormatter pode ser frágil, ver aqui .

É impossível discutir que é maior; todos os metadados tipo em BinaryFormatter pode torná-lo maior. E XmlSerializer pode trabalhar muito com a compactação como gzip.

No entanto, é possível tomar os pontos fortes de cada um; por exemplo, o Google tem código aberto seu próprio formato de serialização de dados, "buffers de protocolo". Isto é:

  • com base em contrato
  • portátil (ver lista de implementações )
  • Versão tolerante
  • com base árvore-
  • opaco (embora haja ferramentas para mostrar dados quando combinado com um .proto)
  • normalmente " primeiro contrato ", mas algumas implementações permitem contratos implícitos baseada na reflexão

Mas importante ainda, é dados muito densa (sem metadados tipo, representação binária pura, tags curtas, truques como variante de comprimento base-7 encoding), e muito eficiente de processo (sem estrutura XML complexo, sem cordas para coincidir com a membros, etc).

Eu poderia ser um pouco tendenciosa; I manter uma das implementações (incluindo vários adequado para C # /. NET), mas você vai notar que eu não tenho vinculado a qualquer aplicação específico; o formato está sob seus próprios méritos ;-P

O Serializer XML produz XML e também um esquema XML (implicitamente). Ela irá produzir XML em conformidade com esse esquema.

Uma implicação é que ele não vai serialize qualquer coisa que não pode ser descrita em XML Schema. Por exemplo, não há nenhuma maneira de distinguir entre uma lista e uma matriz no esquema XML, de modo que o esquema XML produzido pelo seriador pode ser interpretada de qualquer maneira.

Runtime serialização (que o BinaryFormatter faz parte) serializa os tipos .NET reais para o outro lado, por isso, se você enviar um List<int>, do outro lado vai ter uma List<int>.

Isso, obviamente, funciona melhor se o outro lado está em execução .NET.

O XmlSerializer serialises o tipo, lendo todas as propriedades do tipo que têm tanto um getter público e um setter público (e também quaisquer campos públicos). Neste sentido, o XmlSerializer serializa / desserializa a "opinião pública" da instância.

O formatador binário, por outro lado, serializa um tipo de serialização "internos" da instância, isto é, seus campos. Todos os campos que não são marcadas como [NonSerialized] vai ser serializado para o fluxo binário. O tipo em si deve ser marcado como [Serializable] bem como qualquer campos internos que estão também a ser serializado.

Eu acho que um dos mais queridos importantes é que a serialização binária pode serializar públicos e membros privados, enquanto o outro funciona apenas com as públicas.

Em aqui, ele fornece uma comparação muito útil entre os dois em termos de tamanho. É uma questão muito importante, porque você pode enviar o seu objeto serializado a um computador remoto.

http: //www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-versus-xml-serialization-size/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top