c# - 序列化/反序列化的 XML 与二进制性能

标签 c# .net serialization compact-framework protobuf-net

我正在开发一个紧凑的框架应用程序,需要提高性能。该应用程序目前通过将对象序列化为 XML 并将它们存储在数据库中来离线工作。使用分析工具我可以看到这是一个相当大的开销,减慢了应用程序。我想如果我切换到二进制序列化,性能会提高,但因为这在我查看了 protobuf-net 的紧凑框架中不受支持。序列化似乎更快,但反序列化要慢得多,应用程序反序列化比序列化更多。

二进制序列化是否应该更快,如果是这样,我可以做些什么来加快性能?下面是我如何同时使用 XML 和二进制文件的片段:

XML 序列化:

public string Serialize(T obj)
{
  UTF8Encoding encoding = new UTF8Encoding();
  XmlSerializer serializer = new XmlSerializer(typeof(T));
  MemoryStream stream = new MemoryStream();
  XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);
  serializer.Serialize(stream, obj);
  stream = (MemoryStream)writer.BaseStream;
  return encoding.GetString(stream.ToArray(), 0, Convert.ToInt32(stream.Length));
}
public T Deserialize(string xml)
{
  UTF8Encoding encoding = new UTF8Encoding();
  XmlSerializer serializer = new XmlSerializer(typeof(T));
  MemoryStream stream = new MemoryStream(encoding.GetBytes(xml));            
  return (T)serializer.Deserialize(stream);
}

Protobuf-net 二进制序列化:

public byte[] Serialize(T obj)
{
  byte[] raw;
  using (MemoryStream memoryStream = new MemoryStream())
  {
    Serializer.Serialize(memoryStream, obj);
    raw = memoryStream.ToArray();
  }

  return raw;            
}

public T Deserialize(byte[] serializedType)
{
  T obj;
  using (MemoryStream memoryStream = new MemoryStream(serializedType))
  {
    obj = Serializer.Deserialize<T>(memoryStream);
  }
  return obj;
}

最佳答案

我要纠正自己,Marc Gravall 指出第一次迭代有构建模型的开销,所以我做了一些测试,对 XML 和二进制进行 1000 次序列化和反序列化迭代的平均值。我首先尝试使用 Compact Framework DLL 的 v2 进行测试,然后使用 v3.5 DLL。这是我得到的,时间以毫秒为单位:

.NET 2.0
================================ XML ====== Binary ===
Serialization 1st Iteration      3236       5508
Deserialization 1st Iteration    1501       318
Serialization Average            9.826      5.525
Deserialization Average          5.525      0.771

.NET 3.5
================================ XML ====== Binary ===
Serialization 1st Iteration      3307       5598
Deserialization 1st Iteration    1386       200
Serialization Average            10.923     5.605
Deserialization Average          5.605      0.279

关于c# - 序列化/反序列化的 XML 与二进制性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1092020/

相关文章:

c# - 我们是否有 Azure Blob 文件名不支持的字符列表?

c# - 在 C# 中以无序序列重复和计数循环

.net - ILMerge:重命名内部化程序集的命名空间?

c# - "Reference the package directly from the project to resolve this issue."

C# - 序列化和反序列化静态成员

c# - 将 JavaScriptConverter 转换为 json.net JsonConverter

c# - 你怎么知道流是否关闭?

c# - 插入 SQL Server 数据库时文本被截断

.net - 在 .net 3.5 框架和 IIS 7.0 中使用 sqlserver session 状态时是否需要序列化属性

java - 使用 Jackson 将递归对象序列化到一定深度