目前正在进行XML序列化,但速度非常慢。寻找一种从文件中快速保存/加载信息的方法并不真正对它在光盘上的外观感兴趣(如果有什么我希望它被遮挡,因为我不想手动编辑)。
考虑二进制格式,但我不确定它是否能够序列化可能属于自定义类型的属性等。
有什么想法吗?
答案 0 :(得分:7)
答案 1 :(得分:6)
数据究竟是什么?
使用xml,显而易见的答案是使用像GZipStream
这样的smoething来压缩它 - 使它变得更小和模糊。您可以使用BinaryFormatter
,但it is brittle和IMO不适合长期存储。我会说“协议缓冲区”,(也许是protobuf-net),但它取决于“自定义数据”是什么。但是如果你现在使用的是XmlSerializer
,那么protobuf-net可以在没有任何变化的情况下虚拟(可能会添加一些属性) - 而且(在每种情况下我都看到过)比BinaryFormatter
更小,更快。
这是陡峭的学习曲线(另见:Getting Started):
[ProtoContract]
public class Person {
[ProtoMember(1)]
public int Id {get;set;}
[ProtoMember(2)]
public string Name {get;set;}
//...
}
公平地说,如果你使用继承,它可能会让小更棘手 - 尽管不多。在许多情况下,您实际上可以使用现有属性 - 如果包含显式元素顺序,它将与xml / wcf属性一起使用。
答案 2 :(得分:1)
二进制序列化当然适用于自定义类型的属性,并且通常生成比XML序列化更小的文件。如果文件大小是影响您情况的重要因素,那么您肯定应该考虑这种方法。
答案 3 :(得分:1)
我同意Am关于使用像SQLite这样的嵌入式数据库。它带来了显着的好处。在其上层叠ORM的能力可能是最重要的。
XML序列化非常方便,特别是当您需要手动编辑XML或使用其他XML工具(如XSLT等)处理XML时,它也存在一些不可避免的性能问题。在.Net中使用XML序列化的一个重要技术是缓存XML序列化程序。或者在构建时由sgen创建它们。
缓存XML Serializer的原因与以下事实有关:如果在已加载的程序集中找不到序列化程序,.Net运行时将自动生成,编译和加载包含序列化程序的程序集。这个过程可能非常慢。构建新的XMLSerializer实例也可能非常慢。因此你应该缓存它。在缓存序列化程序时要小心,因为不同的XMLSerializer构造函数可以生成行为不同的不同序列化程序实现。特别是关于名称空间等
当然,解析大量文本通常会影响性能。不幸的是,使用XML并不容易避免。
SQLite是比XML更好的选择的原因之一是它的核心是固定长度的记录存储系统。任何具有固定长度记录的二进制文件都将快速读取,索引和扫描。固定块大小的文件格式几乎总是令人惊讶地快速读写。我建议在某个时候为你自己的教育实施一个。
如果您仍然需要基于文本的格式(为了便于互操作)并且不需要ORM的好处,那么请考虑使用FileHelpers 库。