5

datacontractserializerとbinaryformatterシリアライザーについてもっと理解するために記事を読んでいました。これまでに行った読み取りに基づいて、binaryformatterはdatacontractserializerよりもフットプリントが小さいはずだという印象を受けました。DataContractSerializerである理由はxmlinfosetにシリアル化され、binaryformatterは独自のバイナリ形式にシリアル化されます。

以下はテストです

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

DataSetにはテーブルの121317行が入力されました[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

質問 binaryformatterのバイト数がdatacontractserializerよりも多いのはなぜですか?それははるかに少ないべきではありませんか?

4

1 に答える 1

6

DataSet悪い習慣があります。ISerializableデフォルトでは、に渡された場合でも、その内容をXMLの文字列として実装してからシリアル化しますBinaryFormatter。これが、2つのストリームのサイズがほぼ同じである理由です。RemotingFormatプロパティをに変更するBinaryと、同じことが行われますが、新しいを作成し、BinaryFormatterそれ自体をにダンプしてMemoryStream、結果のバイト配列を値として外部BinaryFormatterのストリームに配置します。

それ以外では、BinaryFormatterタイプに関する詳細情報(元のアセンブリのフルネームなど)が含まれています。また、のXMLに加えて、オブジェクトごとのオーバーヘッドがありますDataSet

2つのシリアライザーの動作を比較しようとしている場合DataSetは、オーバーライドが多すぎるため、これは適切な選択ではありません。

于 2011-01-20T01:24:57.970 に答える