Pregunta

Me pasé una buena parte del tiempo la semana pasada trabajando en la serialización.Durante ese tiempo, he encontrado muchos ejemplos de la utilización de la BinaryFormatter o XmlSerializer.Por desgracia, lo que no encontré fueron los ejemplos de forma exhaustiva detallando las diferencias entre los dos.

La génesis de mi curiosidad radica en por qué la BinaryFormatter es capaz de deserializar directamente a una interfaz, mientras que la clase XmlSerializer no lo es. Jon Skeet en una respuesta a "casting para múltiples (tipo desconocido) en tiempo de ejecución"proporciona un ejemplo de dirigir la serialización binaria a una interfaz. Stan R. me proporcionó los medios para lograr mi objetivo utilizando la clase XmlSerializer en su respuesta a "Objeto XML Deserialización a la Interfaz de."

Más allá de lo obvio de la BinaryFormatter utiliza la serialización binaria, mientras que la clase XmlSerializer utiliza XML me gustaría entender más plenamente las diferencias fundamentales.Cuándo utilizar uno u otro y los pros y los contras de cada uno.

¿Fue útil?

Solución

La razón un formateador binario es capaz de deserializar directamente a un tipo de interfaz es porque cuando un objeto es originalmente serializado a un metadatos flujo binario que contiene el tipo y el conjunto de información se pega con los datos de objeto. Esto significa que cuando el formateador binario deserializa el objeto que conoce su tipo, se construye el objeto correcto y, a continuación, puede echar a que un tipo de interfaz que objeto implementa.

El serializador XML en el otherhand simplemente serializa a un esquema y sólo serializa los campos públicos y valores del objeto y ningún tipo de información aparte de eso (por ejemplo, las interfaces implementos de tipo).

Aquí es un buen puesto, NET serialización , comparando la BinaryFormatter , SoapFormatter , y XmlSerializer . Le recomiendo que busque en la siguiente tabla que además de la ya mencionada serializadores incluye el DataContractSerializer , NetDataContractSerializer y protobuf-net .

Comparación serialización

Otros consejos

Sólo a pesar de la...

La diferencia obvia entre los dos es "binario vs xml", pero se va mucho más profundo que eso:

  • campos (BinaryFormatter=bf) vs público los miembros de la (típicamente propiedades) (XmlSerializer=xs)
  • tipo basadas en metadatos (bf) vs contrato (xs)
  • versión-frágil (bf) vs versión tolerantes (xs)
  • "el gráfico" (bf) vs "el árbol" (xs)
  • .Específica NETA (bf) vs portátil (xs)
  • opaco (bf) vs legible por humanos (xs)

Como una discusión de por qué BinaryFormatter puede ser frágil, ver aquí.

Es imposible hablar de que es más grande;todos los tipos de metadatos en BinaryFormatter puede hacer que sea más grande.Y XmlSerializer puede trabajar muy de la compresión como gzip.

Sin embargo, es posible tomar las fortalezas de cada uno;por ejemplo, de Google de código abierto, de sus propios datos formato de serialización, "protocol buffers".Esto es:

  • contrato basado en
  • portátil (ver lista de implementaciones)
  • versión tolerante
  • basada en el árbol
  • opaco (aunque hay herramientas para mostrar los datos cuando se combina con una .proto)
  • típicamente "contrato de primer"pero algunas implementaciones permiten implícita de los contratos basados en la reflexión

Pero lo más importante, es muy densa de datos (no tipo de metadatos, pura representación binaria, el formato corto de etiquetas, trucos como variante de la longitud de la base 7 de la codificación), y muy eficiente para el proceso (no compleja estructura xml, no hay cadenas de hacer coincidir a los miembros, etc).

Yo podría ser un poco sesgada;Yo mantengo una de las implementaciones (incluyendo varios adecuado para C#/.NET), pero se dará cuenta que no he vinculado a cualquier implementación específica;el formato se encuentra bajo sus propios méritos ;-p

El serializador XML XML y produce también un esquema XML (implícitamente). Producirá XML que se ajusta a este esquema.

Una de las consecuencias es que no va a serializar cualquier cosa que no puede ser descrito en el esquema XML. Por ejemplo, no hay manera de distinguir entre una lista y una matriz en XML Schema, por lo que el esquema XML producido por el serializador puede interpretarse de cualquier manera.

Tiempo de ejecución de serialización (que el BinaryFormatter es parte de) serializa los tipos de .NET reales en el otro lado, por lo que si se envía un List<int>, el otro lado tendrá una List<int>.

Esto, obviamente, funciona mejor si la otra parte está ejecutando .NET.

El XmlSerializer serialises el tipo mediante la lectura de todas las propiedades del tipo que tienen tanto un captador público y un colocador pública (y también cualquier campo públicas). En este sentido, el XmlSerializer serializa / deserializa la "vista del público" de la instancia.

El formateador binario, por el contrario, serializa un tipo por serializar "internos" de la instancia, es decir, sus campos. Cualquier campo que no están marcados como [NonSerialized] se serializa en la secuencia binaria. El tipo en sí debe ser marcado como [Serializable] que deben todos los campos internos que son también para ser serializados.

Creo que uno de los más importantes es que la serialización binaria puede serializar los miembros tanto públicas como privadas, mientras que el otro sólo funciona con las públicas.

Aquí, se proporciona una comparación muy útil entre estos dos en términos de tamaño. Es un tema muy importante, ya que podría enviar su objeto serializado a una máquina remota.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top