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

Cha*_*lie 8 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*lie 5

我要对此进行纠正,Marc Gravall指出第一次迭代有一个建模模型的开销,所以我做了一些测试,平均需要1000次迭代的序列化和反序列化的XML和二进制.我首先使用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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 1

有趣的...想法:

  • 这是什么版本的 CF;2.0?3.5?特别是,CF 3.5Delegate.CreateDelegate允许 protobuf-net 比 CF 2.0 中的 can 更快地访问属性
  • 您正在注释字段属性吗?同样,在 CF 中,反射优化是有限的;您可以在 CF 3.5 中使用属性获得更好的性能,因为对于字段,我唯一可用的选项是FieldInfo.SetValue

还有许多其他东西是 CF 中根本不存在的,因此它必须在一些地方做出妥协。对于过于复杂的模型, CF 的泛型限制还存在一个已知问题。修复正在进行中,但这是一个很大的改变,并且需要“一段时间”。

有关信息,这里有XmlSerializer一些关于常规(完整).NET 比较各种格式(包括protobuf-net)的指标。