C# Двоичный формат медленно

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

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

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

Заранее спасибо!

1 ответ

Ваш код может быть улучшен, если вы размещаете утилизацию в 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]);
}
Другие вопросы по тегам