2015-11-19 4 views
0

Я использовал BinaryFormatter для сериализации/десериализации объектов в массив байтов. Но это слишком медленно. Вот мой код:C# Binaryformatter slow

IFormatter formatter = new BinaryFormatter(); 
MemoryStream stream = new MemoryStream(); 
formatter.Serialize(stream, this); 
stream.Close(); 
byte[] currentByteArray = stream.ToArray(); 

Возможно ли улучшить этот код, чтобы ускорить его. Или какие у меня альтернативы? Я видел несколько других сериализаторов, таких как xmlserialization, но я не хочу записывать их в файл, как массив байтов.

Заранее благодарен!

+0

Просьба указать код и метрики в своем вопросе. –

+0

также, насколько велики сериализованные данные? о каком размере мы говорим здесь? – lordkain

+2

'stream.Close();' должно быть * после * 'byte [] currentByteArray = stream.ToArray();', not * before * –

ответ

2

Ваш код может быть улучшен, если вы размещаете утилизации в finally заявлении, как ребята сказали в комментариях:

IFormatter formatter; 
MemoryStream stream; 
try 
{ 
    formatter = new BinaryFormatter(); 
    stream = new MemoryStream(); 
    formatter.Serialize(stream, this); 
    byte[] currentByteArray = stream.ToArray(); 
} 
finally 
{ 
    if(stream!=null) 
     stream.Close(); 
} 

Однако приведенный выше код не улучшает производительность BinaryFormatter класса потому что работает и используется правильно. Но вы можете использовать другие библиотеки.

Одним из самых быстрых и универсальных сериализаторов в .NET является Protobuf-net. Например:

[ProtoContract] 
class SubMessageRepresentations 
{ 
    [ProtoMember(5, DataFormat = DataFormat.Default)] 
    public SubObject lengthPrefixedObject; 
    [ProtoMember(6, DataFormat = DataFormat.Group)] 
    public SubObject groupObject; 
} 

[ProtoContract(ImplicitFields=ImplicitFields.AllFields)] 
class SubObject { public int x; } 


using (var stream = new MemoryStream()) { 
    _pbModel.Serialize(
    stream, new SubMessageRepresentations { 
     lengthPrefixedObject = new SubObject { x = 0x22 }, 
     groupObject = new SubObject { x = 0x44 } 
    }); 
byte[] buf = stream.GetBuffer(); 
for (int i = 0; i < stream.Length; i++) 
Console.Write("{0:X2} ", buf[i]); 
} 
Смежные вопросы