2013-08-14 2 views
0

Я следующие методы расширения для клонирования список с элементами:BinaryFormatter становится медленнее, чем XmlSerializer больше деталей я сериализации/десериализации

public static class MyExtensionMethods 
    { 
     public static T CloneXml<T>(this T source) 
     { 
      var stream = new MemoryStream(); 
      var xmls = new XmlSerializer(typeof(T)); 
      xmls.Serialize(stream, source); 
      stream.Seek(0, SeekOrigin.Begin); 
      return (T)xmls.Deserialize(stream); 
     } 

     public static T CloneBinary<T>(this T source) 
     { 
      var formatter = new BinaryFormatter(); 
      var stream = new MemoryStream(); 
      formatter.Serialize(stream, source); 
      stream.Seek(0, SeekOrigin.Begin); 
      return (T)formatter.Deserialize(stream); 
     } 
    } 

Для теста я использую следующий объект:

[Serializable] 
public class MyItem 
{ 
    public string Name { get; set; } 
} 

Теперь, когда я клонирую список из 100 объектов MyItem, решение BinaryFormatter (1 мс) будет намного быстрее, чем мое решение XmlSerializer (110 мс). Но если у меня есть 100000 объектов MyItem в списке, решение BinaryFormatter (1s) будет медленнее, чем решение XmlSerializer (450 мс).

Что здесь происходит?

ответ

2

Двоичный формат искажает все метаданные, такие как тип, информация о сборке.

XMLSerializer просто сериализуется в схему (общедоступные поля, значения объекта). поэтому я думаю, что это причина, почему он быстрее

http://blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

+0

Это делает общий смысл для меня. Благодарю. –

Смежные вопросы