c#二进制格式化程序速度慢

本文关键字:速度慢 程序 格式化 二进制 | 更新日期: 2023-09-27 18:22:27

我使用BinaryFormatter将对象序列化/反序列化为字节数组。但是太慢了。这是我的代码:

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

有没有可能改进代码,以加快速度。或者我的选择是什么?我见过其他一些序列化程序,比如xmlserialization,但我不想将其作为字节数组写入文件。

提前感谢!

c#二进制格式化程序速度慢

如果像大家在评论中所说的那样将disposition放在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]);
}