Quais são as diferenças entre o XmlSerializer e BinaryFormatter
-
18-09-2019 - |
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.
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 .
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/