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]);
}