提高代码序列化速度的更好方法

Ang*_*ker 3 c# performance serialization visual-studio-2005

我有以下代码将List序列化为字节数组,以通过Web服务进行传输。该代码在较小的实体上工作相对较快,但这是一个大约60,000个项目的列表。执行formatter.Serialize方法需要几秒钟。无论如何要加快速度?

public static byte[] ToBinary(Object objToBinary)
{
    using (MemoryStream memStream = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
        formatter.Serialize(memStream, objToBinary);
        memStream.Seek(0, SeekOrigin.Begin);
        return memStream.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*nky 5

您遇到的效率低下有几种原因:

  1. 默认的序列化例程使用反射来枚举对象字段并获取它们的值。
  2. 二进制序列化格式将内容存储在以字段的字符串名称作为关键字的关联列表中。
  3. 您在其中有一个伪造者ToArray(如Danny所述)。

通过实现ISerializable包含在其中的对象类型,您可以立即获得很大的改进List。这将消除使用反射的默认序列化行为。

如果减少保存序列化数据的关联数组中的元素数量,则可以提高速度。确保确实存储在该关联数组中的元素是基本类型。

最后,您可以消除,ToArray但我怀疑您会注意到带来的冲击。