我正在寻找最快的方法来序列化和反序列化.NET对象。以下是我目前所拥有的方法:
public class TD
{
public List<CT> CTs { get; set; }
public List<TE> TEs { get; set; }
public string Code { get; set; }
public string Message { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public static string Serialize(List<TD> tData)
{
var serializer = new XmlSerializer(typeof(List<TD>));
TextWriter writer = new StringWriter();
serializer.Serialize(writer, tData);
return writer.ToString();
}
public static List<TD> Deserialize(string tData)
{
var serializer = new XmlSerializer(typeof(List<TD>));
TextReader reader = new StringReader(tData);
return (List<TD>)serializer.Deserialize(reader);
}
}
9条答案
按热度按时间ghhaqwfi1#
下面是使用protobuf-net的模型(使用发明的
CT
和TE
)(还保留使用XmlSerializer
的能力,这可能很有用-特别是对于迁移);我谦卑地承认(如果您需要的话,可以提供大量证据),这是. NET中最快的(或者肯定是最快的)通用序列化器。如果你需要字符串,只需用base-64编码二进制。
tzdcorbm2#
我在这篇文章中对不同格式进行了全面的比较-https://medium.com/@maximn/serialization-performance-comparison-xml-binary-json-p-ad737545d227
只有一个样本来自-x1c 0d1x后
epggiuax3#
出于对这个问题的兴趣,我决定用最接近“苹果对苹果”的测试来测试建议的方法。我用以下代码编写了一个控制台应用程序:
结果令我吃惊;当运行多次时,它们是一致的:
收集这些结果后,我决定看看ProtoBuf或NetSerializer在处理较大对象时性能是否更好。我将收集计数更改为10,000个对象,但将数组的大小从1 -100增加到1 - 10,000。结果似乎更加确定:
因此,我的结论是:在某些情况下,ProtoBuf和NetSerializer非常适合,但就至少相对简单的对象的原始性能而言... BinaryFormatter的性能明显更高,至少高出一个数量级。
YMMV公司。
tktrz96b4#
Protobuf非常非常快
有关此系统性能和实现的详细信息,请参见http://code.google.com/p/protobuf-net/wiki/Performance。
lp0sw83n5#
还有一个声称超快的串行器是netserializer。
他们网站上给出的数据显示了2x - 4x over protobuf的性能,我自己还没有尝试过这个,但是如果你正在评估各种选项,也可以试试这个
s2j5cfk06#
net中包含的二进制序列化程序应该比XmlSerializer或protobuf、json等的其他序列化程序快。
但是对于其中的一些,你需要添加属性,或者其他一些方法来添加元数据。例如ProtoBuf内部使用数字属性ID,并且Map需要通过不同的机制来保存。版本控制对于任何序列化程序来说都不是微不足道的。
kmbjn2e37#
我删除了上述代码中的错误,并得到以下结果:另外,我不确定NetSerializer如何要求您注册要序列化的类型,这可能会造成什么样的兼容性或性能差异。
修改代码
hwazgwia8#
你可以试试Salar.Bois串行化器,它有不错的性能,它关注的是负载大小,但也提供了很好的性能。
如果你想自己查看和比较结果,Github页面中有基准测试。
https://github.com/salarcode/Bois
bvuwiixz9#
我冒昧地将您的类输入到CGbR生成器中。因为它还处于早期阶段,还不支持
DateTime
,所以我简单地将其替换为long。生成的序列化代码如下所示:我创建了一个示例对象列表,如下所示:
Release
版本中我的计算机上的结果:**大小:**149000字节
**时间:**2.059毫秒3.13毫秒
**编辑:**从CGbR 0.4.3开始,二进制序列化器支持DateTime。不幸的是,
DateTime.ToBinary
方法非常慢。我将很快用更快的方法替换它。Edit2:通过调用
ToUniversalTime()
使用UTCDateTime
时,性能将恢复并以1.669ms计时。