【发布时间】:2015-10-22 06:40:12
【问题描述】:
我们为大量 C# 类型提供了自定义序列化过程。但是,为所有类/类型重新生成所有序列化信息非常耗时,我们计划通过计算文件的哈希来优化序列化过程,如果不同,我们生成序列化输出,否则我们跳过它。 编辑:我们可以将哈希值存储在字典中,该字典可以输出到文件并在处理时重新读取。这是目前的想法。
我们当前的序列化处理器的工作方式如下 - 我们将要序列化的类型添加到 repo:
SerializerRepo.Add(typeof(MyType)); //Add type to be serialized to a repo
然后(可能在代码中的其他地方)让序列化程序处理 repo 并输出自定义 XML 等,
Serializer.WriteXML(SerializerRepo.GetTypes());
WriteXML 遍历每种类型并在特定位置为每种类型输出一个 XML 文件。我需要优化WriteXML 方法以仅在类/类型发生变化时对其进行序列化,否则就让它发生。
这可能不是最好的方法,并且可以接受重构建议。但是,当前的问题是如何确定包含类/类型的类定义(或文件)是否已更改,以确定是否应生成 XML?
由于类可以是部分的,因此类型和相应的类之间没有内在关系,.Net 没有从类型到类文件的任何此类映射,反之亦然。但是,我们没有任何部分类。但在我们的例子中,我们似乎需要两条(尽管不相关的)信息——包含类型/类的文件和类型本身。
到目前为止有两个(可能不是最佳的)想法:
我们要么让用户指定文件名和类型。但这不适用于更改文件名的任何类型的重构。
另一种解决方案是手动读取每个 .cs 文件并解析
public class <classname>并将其映射到每种类型。这似乎是一个巨大的开销,并且不确定这是否是一种可靠的方法。
这是我仅有的两个想法,但没有具体的想法。有什么建议吗?
【问题讨论】:
-
瓶颈在哪里?是序列化,还是写入文件?我有一种感觉,无论如何序列化和写入与打开文件和计算哈希/比较将同样昂贵和耗时。您可以在 XML 中存储哈希信息吗?也许有一个存储所有哈希的索引文件?
-
在某个地方,您必须在序列化时保留某种哈希值,以便稍后与它进行比较。
-
你不能将之前序列化的 XML 与类 def 进行比较并检查差异。
-
使用 PostSharp 之类的东西,您可以将属性应用于可序列化的类。然后在编译时你可以让 postsharp 属性检查类的变化并生成你的哈希。
-
@RonBeyer - 瓶颈是
WriteXML方法。它解析整个类文件并生成输出到 XML 中的信息。将其扩展到大约 1000 多个文件,它会变得非常慢。