2011-01-20 10 views
5

Stavo passando per gli articoli per capire di più sui serializzatori datacontractserializer e binaryformatter. Sulla base della lettura fin qui svolta ho avuto l'impressione che il formato binario avrebbe dovuto avere un ingombro minore rispetto al datacontractorerializer. Il motivo è che DataContractSerializer si serializza su infoset xml mentre il formato binario serializza su un formato binario proprietario.DataContractSerializer vs BinaryFormatter performance

seguito è il test

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

DataSet è stato popolato con 121317 righe dalla tabella [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 

Domanda Perché il numero di byte per BinaryFormatter più di DataContractSerializer? Non dovrebbe essere molto meno?

risposta

5

DataSet ha una cattiva abitudine: implementa ISerializable e quindi serializza il suo contenuto come una stringa di XML per impostazione predefinita, anche quando viene passato a un BinaryFormatter. Questo è il motivo per cui i due flussi sono quasi identici nelle dimensioni. Se si modifica la proprietà RemotingFormat su Binary, verrà eseguita la stessa operazione ma creando un nuovo BinaryFormatter, scaricandosi in un MemoryStream e quindi inserendo l'array di byte risultante come valore nello stream BinaryFormatter esterno.

Al di fuori di questo, BinaryFormatter contiene ulteriori informazioni sui tipi, ad esempio il nome completo dell'assembly da cui provengono; inoltre, esiste l'overhead per oggetto sull'XML per un DataSet.

Se si sta tentando di confrontare il comportamento dei due serializzatori, DataSet è una scelta scadente perché sovrascrive troppo.

+0

Grazie per l'intuizione. Sono bloccato con l'uso di DataSet. Troppi problemi !! – stackoverflowuser

+0

@stackoverflowuser: Ho avuto un'ottima fortuna con l'esecuzione del flusso serializzato attraverso un deflatore, se la dimensione è un grosso problema. –