2011-01-20 14 views
5

Przeglądałem artykuły, aby lepiej zrozumieć serię próbników datacontractserializer i binaryformatter. Na podstawie dotychczasowych odczytów miałem wrażenie, że format binarny powinien mieć mniejszą powierzchnię niż moduł przetwarzania danych. Powodem jest to, że DataContractSerializer serializuje do pliku xml, natomiast binaryformatter serializuje do zastrzeżonego formatu binarnego.DataContractSerializer vs BinaryFormatter performance

Poniżej 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 została wypełniona 121317 rzędach od [AdventureWorks].[Sales].[SalesOrderDetail] tabeli

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 

pytań Dlaczego liczba bajtów dla BinaryFormatter więcej niż DataContractSerializer? Czy nie powinno to być dużo mniejsze?

Odpowiedz

5

DataSet ma zły nawyk: implementuje ISerializable a następnie serializes jego zawartość jako ciąg XML domyślnie, nawet gdy przeszedł do BinaryFormatter. Dlatego oba strumienie są prawie identyczne. Jeśli zmienisz jego właściwość RemotingFormat na Binary, zrobi to samo, ale tworząc nowy BinaryFormatter, zrzucając się do MemoryStream, a następnie umieszczając wynikową tablicę bajtów jako wartość w zewnętrznym strumieniu BinaryFormatter.

Poza tym BinaryFormatter zawiera więcej informacji o typach, takich jak pełna nazwa zgromadzenia, z którego pochodzą; ponadto narzut na obiekt XML związany jest z wartością dla obiektu DataSet.

Jeśli próbujesz porównać zachowanie dwóch serializerów, DataSet jest złym wyborem, ponieważ przesłoniło zbyt wiele.

+0

Dzięki za wgląd. Utknąłem przy użyciu DataSet. Zbyt wiele problemów !! – stackoverflowuser

+0

@stackoverflowuser: Miałem doskonałe szczęście z uruchomieniem serializowanego strumienia przez deflater, jeśli rozmiar jest dużym problemem. –