DataContractSerializer против производительности BinaryFormatter - PullRequest
5 голосов
/ 20 января 2011

Я просматривал статьи, чтобы больше узнать о сериализаторе datacontractserializer и двоичном форматере. Основываясь на сделанном до сих пор чтении, у меня сложилось впечатление, что двоичный форматер должен занимать меньше места, чем datacontractserializer. Причина в том, что DataContractSerializer сериализуется в информационный набор xml, в то время как двоичный форматер сериализуется в закрытый двоичный формат.

Следующий тест

    [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

Вопрос Почему количество байт для двоичного формата больше, чем для datacontractserializer? Разве это не должно быть намного меньше?

1 Ответ

5 голосов
/ 20 января 2011

DataSet имеет дурную привычку: он реализует ISerializable и затем по умолчанию сериализует свое содержимое в виде строки XML, даже когда передается в BinaryFormatter.Вот почему два потока почти одинаковы по размеру.Если вы измените его свойство RemotingFormat на Binary, он сделает то же самое, но создаст новый BinaryFormatter, сбросит себя в MemoryStream, а затем поместит полученный байтовый массив как значение во внешний *Поток 1008 *.

Помимо этого, BinaryFormatter содержит больше информации о типах, например полное имя сборки, из которой они получены;Кроме того, для XML-объекта DataSet.

существуют накладные расходы для каждого объекта, если вы пытаетесь сравнить поведение двух сериализаторов, DataSet - плохой выбор, поскольку он переопределяетслишком много.

...