2011-01-20 2 views
5

datacontractserializer 및 binaryformatter serializers에 대한 자세한 내용을 다루는 기사를 읽었습니다. 지금까지 읽은 내용을 토대로 필자는 binaryformatter가 datacontractserializer보다 적은 설치 공간을 가져야한다는 인상하에있었습니다. DataContractSerializer가되는 이유는 XML infoset으로 serialize되는 반면 binaryformatter는 독점적 인 바이너리 형식으로 serialize됩니다.DataContractSerializer 대 BinaryFormatter 성능

다음은

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

데이터 집합이 [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 

질문에서 121317 행으로 채워 된 시험이다 왜 datacontractserializer 이상의 경우 BinaryFormatter에 대한 바이트 수 더? 그것은 훨씬 덜해야하지 않습니까?

답변

5

는 나쁜 습관이 있습니다. ISerializable을 구현 한 다음 BinaryFormatter으로 전달 된 경우에도 기본적으로 해당 내용을 XML 문자열로 serialize합니다. 이 때문에 두 스트림의 크기가 거의 동일합니다. RemotingFormat 속성을 Binary으로 변경하면 동일한 작업을 수행하지만 새로운 BinaryFormatter을 만들고 MemoryStream에 자체적으로 덤핑 한 다음 결과 바이트 배열을 BinaryFormatter의 스트림에 넣습니다.

외에도 BinaryFormatter은 유형에 대한 정보를 제공합니다 (예 : 출품 한 조립품의 전체 이름). 또한 XML 상단에 객체 당 오버 헤드가 DataSet입니다.

두 개의 serializer의 동작을 비교하려는 경우 DataSet은 너무 많이 무시하기 때문에 좋지 않습니다.

+0

통찰력에 감사드립니다. DataSet을 사용하는 데 어려움이 있습니다. 너무 많은 문제 !! – stackoverflowuser

+0

@stackoverflowuser : 크기가 큰 문제인 경우, 필자는 직렬화 된 스트림을 디플로터를 통해 실행하는 것만으로도 운이 좋았다. –