2011-01-20 21 views
5

Estaba repasando artículos para comprender más acerca del serializador de datacontractserializer y binaryformatter. En base a la lectura realizada hasta el momento, tenía la impresión de que el formato binario debería tener una huella menor que el agente de contraste de datos. Motivo por el que DataContractSerializer se serializa en xml infoset, mientras que binaryformatter se serializa en un formato binario patentado.DataContractSerializer vs BinaryFormatter rendimiento

A continuación se presenta la prueba

[Serializable] 
    [DataContract] 
    public class Packet 
    { 
     [DataMember] 
     public DataSet Data { get; set; } 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Description { get; set; } 
    } 

conjunto de datos se rellena con 121317 filas de la tabla [AdventureWorks].[Sales].[SalesOrderDetail]

using (var fs = new FileStream("test1.txt", FileMode.Create)) 
    { 
     var dcs = new DataContractSerializer(typeof(Packet)); 
     dcs.WriteObject(fs, packet); 
     Console.WriteLine("Total bytes with dcs = " + fs.Length); 
    } 



    using(var fs = new FileStream("test2.txt", FileMode.Create)) 
    { 
     var bf = new BinaryFormatter(); 
     bf.Serialize(fs, packet); 
     Console.WriteLine("Total bytes with binaryformatter = " + fs.Length); 
    } 


Results 
Total bytes with dcs = 57133023 
Total bytes with binaryformatter = 57133984 

Pregunta ¿Por qué es el número de bytes para BinaryFormatter más de DataContractSerializer? ¿No debería ser mucho menor?

Respuesta

5

DataSet tiene un mal hábito: implementa ISerializable y luego serializa su contenido como una cadena de XML de forma predeterminada, incluso cuando se pasa a BinaryFormatter. Esta es la razón por la cual las dos corrientes son casi idénticas en tamaño. Si cambia su propiedad RemotingFormat a Binary, hará lo mismo pero creando un nuevo BinaryFormatter, volcándose en un MemoryStream, y luego colocando el conjunto de bytes resultante como un valor en la corriente externa de BinaryFormatter.

Fuera de eso, BinaryFormatter tiene más información sobre los tipos, tales como el nombre completo de la asamblea vinieron; Además, existe la sobrecarga por objeto en la parte superior del XML para un DataSet.

Si está tratando de comparar el comportamiento de los dos serializadores, DataSet es una opción incorrecta porque anula demasiado.

+0

Gracias por la información. Estoy atascado con el uso de DataSet. Demasiados problemas !! – stackoverflowuser

+0

@stackoverflowuser: He tenido una excelente suerte con solo ejecutar la secuencia serializada a través de un deflater, si el tamaño es un gran problema. –