2011-01-20 2 views
5

Je parcourais des articles pour en savoir plus sur les sérialiseurs datacontrerserializer et binaryformatter. Sur la base de la lecture faite jusqu'à présent, j'avais l'impression que binaryformatter devrait avoir une empreinte inférieure à celle de datacontrerserializer. Raison étant DataContractSerializer sérialise à l'informationet xml tandis que binaryformatter sérialise à un format binaire propriétaire.Performance DataContractSerializer vs BinaryFormatter

Après le test est

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

était peuplée de 121317 lignes de [AdventureWorks].[Sales].[SalesOrderDetail] Table

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 

Question Pourquoi le nombre d'octets pour BinaryFormatter plus de DataContractSerializer? Ne devrait-il pas être beaucoup moins?

Répondre

5

DataSet a une mauvaise habitude: il implémente ISerializable puis sérialise son contenu en tant que chaîne de code XML par défaut, même lorsqu'il est passé à BinaryFormatter. C'est pourquoi les deux flux sont presque identiques en taille. Si vous modifiez sa propriété RemotingFormat à Binary, il fera la même chose mais en créant un nouveau BinaryFormatter, en se vidant dans un MemoryStream, puis en plaçant le tableau d'octets résultant en tant que valeur dans le flux externe de BinaryFormatter.

En dehors de cela, BinaryFormatter contient plus d'informations sur les types, tels que le nom complet de l'assemblage dont ils proviennent; également, il y a le sur-objet par-dessus le XML pour un DataSet.

Si vous essayez de comparer le comportement des deux sérialiseurs, DataSet est un mauvais choix car il surcharge trop.

+0

Merci pour la perspicacité. Je suis bloqué avec l'utilisation de DataSet. Trop de problèmes !! – stackoverflowuser

+0

@stackoverflowuser: J'ai eu beaucoup de chance avec l'exécution du flux sérialisé via un déflateur, si la taille est un gros problème. –