В этом посте я собираюсь сравнить несколько способов сериализации в приложениях Windows Phone 7. Я покажу, сколько времени потребовалось для сериализации и десериализации объекта и какого размера имел выходной поток. Сравнение включает Xml сериализацию , DataContract сериализацию , DataContract JSON сериализацию и мою бинарную сериализацию для Windows Phone 7 , Json.NET сериализации , sharpSerializer . Я описал каждый из этих типов в моих предыдущих постах.
Тесты проводились с использованием устройства Windows Phone 7 от LG.
Вступление
Прежде чем сравнивать несколько типов сериализации Windows Phone 7 (и Silverlight), я бы хотел сказать, что у каждого типа есть свои преимущества и недостатки для определенных типов задач. Это означает, что для хранения объектов в изолированном хранилище один тип лучше другого, но когда дело доходит до Windows Communication Foundation (WCF), то это может быть наоборот. Итак, прежде всего вам нужно определить свою задачу . Что касается моего сравнения, моей миссией было найти наиболее подходящий способ сериализации для хранения объектов в изолированном хранилище. Из-за того, что устройства Windows Phone 7 имеют очень ограниченный объем памяти (размер файла), это был важный критерий в моих тестах.
Образец объекта
Сначала я создал образец класса, который поддерживается каждым типом сериализации, упомянутым в этом посте. Вот код для этого класса:
[DataContract] public class SampleData { [XmlElement] [DataMember] public string ContentText { get; set; } [XmlElement] [DataMember] public List<int> SomeItems { get; set; } public void Fill() { StringBuilder sb = new StringBuilder(); for (int index = 0; index < 1000; index++) { sb.Append("sometext sometext\n"); } ContentText = sb.ToString(); SomeItems = new List<int>(); for (int index = 0; index < 1000; index++) { SomeItems.Add(index); } } }
Тестирование XML-сериализации
Я начал свое путешествие с XML-сериализации с использованием XmlSerializer . Я создал метод для тестирования (см. Код ниже) и запускаю его ровно пять раз. Длина объекта потока была 48070 байт.
public void TestXMLSerializer(SampleData sd) { using (MemoryStream ms = new MemoryStream()) { // time in milliseconds double serTime = TestMethod(() => XMLSerializerHelper.Serialize(ms, sd)); long size = ms.Length; ms.Position = 0; double deSerTime = TestMethod(() => XMLSerializerHelper.Deserialize(ms, typeof(SampleData))); } }
Вы можете увидеть результаты XML-сериализации для Windows Phone 7 ниже. Этот тип сериализации довольно быстрый, но размер потока довольно велик.
Тип | Время (в миллисекундах) | Средний | ||||
Сериализация | 309 | 309 | 306 | 310 | 304 | 307,6 |
Десериализация | 191 | 188 | 187 | 189 | 193 | 189,6 |
Тестирование сериализации DataContract
Затем я протестировал сериализацию DataContract . Еще раз я создал метод для тестирования (код ниже). Длина потока составила 42165 байт.
public void TestDataContractSerialization(SampleData sd) { using (MemoryStream ms = new MemoryStream()) { // time in milliseconds double serTime = TestMethod(() => DataContractSerializationHelper.Serialize(ms, sd)); long size = ms.Length; ms.Position = 0; double deSerTime = TestMethod(() => DataContractSerializationHelper.Deserialize(ms, typeof(SampleData))); } }
Посмотрите на результаты сериализации DataContract в таблице ниже. Вероятно, один из худших результатов в этом сравнении. Размер потока немного лучше, чем размер потока во время сериализации XML.
Тип | Время (в миллисекундах) | Средний | ||||
Сериализация | 469 | 471 | 469 | 478 | 471 | 471,6 |
Десериализация | 190 | 196 | 198 | 200 | 193 | 195,4 |
Тестирование DataContract JSON-сериализации
Другим конкурентом была сериализация DataContract JSON . Метод тестирования показан ниже. Длина потока составила 22922 байта.
public void TestDataContractJSONSerialization(SampleData sd) { using (MemoryStream ms = new MemoryStream()) { // time in milliseconds double serTime = TestMethod(() => DataContractJSONSerializationHelper.Serialize(ms, sd)); long size = ms.Length; ms.Position = 0; double deSerTime = TestMethod(() => DataContractJSONSerializationHelper.Deserialize(ms, typeof(SampleData))); } }
Результаты для сериализации DataContract JSON (таблица ниже) лучше, чем для сериализации DataContract, особенно при сравнении размера потока.
Тип | Время (в миллисекундах) | Средний | ||||
Сериализация | 494 | 494 | 492 | 490 | 497 | 493,4 |
Десериализация | 189 | 188 | 197 | 188 | 189 | 190,2 |
Тестирование пользовательской двоичной сериализации
Наконец, моя пользовательская двоичная сериализация для Windows Phone 7 показала лучшие результаты в этом сравнении. Проверьте метод, который я использовал для тестирования ниже. Длина потока составила 22007 байт.
public void TestBinarySerialization(SampleData sd) { using (MemoryStream ms = new MemoryStream()) { // time in milliseconds double serTime = TestMethod(() => BinarySerializationHelper.Serialize(ms, sd)); long size = ms.Length; ms.Position = 0; double deSerTime = TestMethod(() => BinarySerializationHelper.Deserialize(ms, typeof(SampleData))); } }
Вот результаты, которые я получил для моей пользовательской двоичной сериализации. Время десерилизации поражает. Также размер потока меньше, чем в сериализации DataContract JSON.
Тип | Время (в миллисекундах) | Средний | ||||
Сериализация | 123 | 130 | 123 | 124 | 123 | 124,6 |
Десериализация | 21 | 22 | 21 | 21 | 22 | 21,4 |
Тестирование сериализации Json.NET
После нескольких комментариев, касающихся Json.NET, я решил добавить его в свое сравнение. Я также создал учебник, описывающий, как сериализовать и десериализовать объекты, используя подход Json.NET . Длина потока была не такой большой, как для сериализаций на основе XML, всего 22922 байта (аналогично размеру потока сериализации DataContract JSON).
public void TestJSONNETSerialization(SampleData sd) { using (MemoryStream ms = new MemoryStream()) { // time in milliseconds double serTime = TestMethod(() => JSONNETSerializationHelper.Serialize(ms, sd)); long size = ms.Length; ms.Position = 0; double deSerTime = TestMethod(() => { JSONNETSerializationHelper.Deserialize(ms, typeof(SampleData)); }); } }
Результаты (таблица ниже) немного лучше по сравнению с типами сериализации DataContract и DataContractJSON, но нет шансов превзойти результаты пользовательской двоичной сериализации.
Тип | Время (в миллисекундах) | Средний | ||||
Сериализация | 451 | 421 | 411 | 415 | 420 | 423,6 |
Десериализация | 133 | 132 | 131 | 137 | 131 | 132,8 |
Тестирование sharpSerializer
Лично мне этот csharpSerializer очень нравится, и результаты тестов для этой сериализации выглядят довольно многообещающе. Размер потока для двоичной сериализации csharpSerializer составлял 28177 байт, а для сериализации XML csharpSerializer — 54292 байта.
public void TestSharpSerializer(SampleData sd) { using (MemoryStream ms = new MemoryStream()) { // time in milliseconds double serTime = TestMethod(() => SharpSerializerHelper.Serialize(ms, sd)); long size = ms.Length; ms.Position = 0; double deSerTime = TestMethod(() => { SharpSerializerHelper.Deserialize(ms); }); } }
Я проверил оба типа SharpSerializer XML и двоичные. Результаты двоичной сериализации довольно хорошие, результаты XML-вывода почти такие же, как и для XMLSerializer.
Бинарный (sharpSerializer)
Тип | Время (в миллисекундах) | Средний | ||||
Сериализация | 250 | 250 | 247 | 247 | 249 | 248,6 |
Десериализация | 60 | 60 | 61 | 61 | 60 | 60,4 |
XML (sharpSerializer)
Тип | Время (в миллисекундах) | Средний | ||||
Сериализация | 278 | 283 | 280 | 286 | 278 | 281 |
Десериализация | 179 | 177 | 179 | 185 | 176 | 179,2 |
Окончательные результаты
Ниже приводится таблица окончательных результатов для сравнения этих четырех способов сериализации для Windows Phone 7 (и, возможно, Silverlight). По этим результатам у нас чистый победитель: двоичная сериализация . Возможно, моя реализация двоичной сериализации еще не идеальна, но все же она показывает лучшие результаты в моих сравнениях и тестах.
Тип | Сериализация (мс) | Десериализация (мс) | Размер (байт) | |
Пользовательская двоичная сериализация | 124,6 | 21,4 | 22007 | |
sharpSerializer Двоичная Сериализация | 248,6 | 60,4 | 28177 | |
sharpSerializer XML-сериализация | 281 | 179,2 | 54292 | |
XMLSerializer | 307,6 | 189,6 | 48070 | |
Сериализация Json.NET | 423,6 | 132,8 | 22922 | |
Сериализация DataContract JSON | 493,4 | 190,2 | 22922 | |
Сериализация DataContract | 471,6 | 195,4 | 42165 | |
Версия для печати
Резюме
Как я уже говорил ранее, в разработке много конкретных задач, и каждая из них требует особого подхода. С моей точки зрения, если задача заключается в хранении сериализованных данных в изолированном хранилище, то я бы использовал sharpSerializer (Binary) или мою пользовательскую двоичную сериализацию, поскольку размер сериализованных данных мал. Также скорость сериализации и десериализации довольно хороша. Когда ваша задача требует передачи данных по сети (например), я бы выбрал тип среди сериализаций на основе XML или сериализаций на основе JSON. Важным моментом является то, что результаты тестов, создаваемых эмулятором Windows Phone 7 и настоящим устройством Windows Phone 7, сильно отличаются
Исходный код
Вы можете попробовать запустить эти тесты на ваших собственных пользовательских объектах. Вот исходный код для этого:
КОД ИСТОЧНИКА
Источник: http://www.eugenedotnet.com/2010/12/windows-phone-7-serialization-comparison/