我正在尝试序列化大约30 KB的数据,我需要找到一种更快的方式来序列化和反序列化数据。对我来说速度和大小一样重要,所以要么我找到一种方法来更紧密地压缩数据,要么我需要一个更快的机制来构建对象。我已经尝试为它构建一些自定义方法以及使用内置的序列化方法,但我希望那里的人有一些经验。
在我的应用程序中,毫秒计数,因此与大小相比,速度很好,特别是因为某些对象可能非常大。
修改
数据是一个包含许多属性的对象,包括字典和一些整数和字符串字段。假设一个复杂的网格。
所以我做了一个例子,让你对这个对象中的关系看起来有点了解。
<Serializable()> Class A
Inherits B
Dim _C As New C
Dim E As Byte()
End Class
<Serializable()> Class B
Dim A As Int32
Dim B As Dictionary(Of String, Object)
End Class
<Serializable()> Class C
Dim A As Int32
Dim D As String
End Class
当然也有字段的访问者,但这不应该影响这个。
答案 0 :(得分:2)
有些事情会浮现在脑海中。
是否可以减少序列化的数据量?这对你来说可能是一个死胡同,但它显然会对性能产生很大的影响。
您可以通过流式传输序列化数据来减少总体延迟吗?如果序列化对象图的目标是网络流,文件等,那么您可以重叠两个或更多个操作并减少总体延迟。
您是否可以降低结构的通用性以使自定义序列化涵盖更多案例?我正在看B :: B并且它可以通过Dictionary的值拉入任何类型。可能是放入该词典的实际类型完全在您的控制范围内,但值得提出,因为更简单,更受控制的数据结构通常更容易和更快地序列化。
您可以利用的数据是否存在冗余?如果您知道字典中包含的某些对象在功能上是等效的,那么您可以将它们序列化为一个组,并在序列化字典时仅通过索引引用它们。
另外,不要低估大小对性能的影响。同样,它取决于程序对结构的作用,但即使产生大字节流本身也可能产生时间成本。当然,通过网络或文件发送更多字节也需要更多时间。
我建议为类创建最小的自定义序列化代码会比运行时的默认序列化产生净改进,即使只是因为你不需要写出如此多的元数据。儿童成员的建设也应该更快。
另一种技术(可能在此处可能没有帮助)使您的数据结构更好地链接到序列化。例如,如果你有一个类似树的结构,除了父子引用之外,还要保持兄弟对兄弟的引用,这样你就可以按顺序枚举它们,而不需要递归处理树的成本。堆也浮现在脑海中。您可以迭代堆中的项目,而不考虑项目彼此之间的相互关联。
答案 1 :(得分:0)
答案主要取决于要序列化的数据的种类和结构。
如果数据是一个30K的字节数组,那么将整个事物作为单个块写入二进制流,它不会比这快得多。
如果数据是嵌入在互连网格中的30K网格的高度结构化对象...... - 祝你好运!
答案 2 :(得分:0)
Marc Gravell博客上的帖子 protobuf-net vs NetDataContractSerializer 中有一个有趣的基准。
无论如何,如果您想要一个有用的答案,您需要提供有关数据结构的更多详细信息。