在序列化之前,如何检查类文件是否已更改?

时间:2015-07-30 18:44:10

标签: c# algorithm

我们为大量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没有从类型到类文件的任何这种映射,反之亦然。但是,我们没有任何部分课程。但在我们的例子中,我们似乎需要两个(尽管是无关的)信息 - 包含类型/类和文件类型的文件。

到目前为止有两个(可能是次优的)想法:

  1. 要么我们让用户指定文件名和类型。但是,对于文件名更改的任何重构都不合适。

  2. 另一种解决方案是手动读取每个.cs文件并解析public class <classname>并将其映射到每种类型。这似乎是一个巨大的开销,并不确定它是否是一种可行的方法。

  3. 这是我唯一的两个想法,但没有具体的。建议?

1 个答案:

答案 0 :(得分:2)

将XML内存的生成与将其持久保存到磁盘分开。

保存从完全限定类名到哈希的字典。在第一次运行时,字典将以空白开始。

当需要确保类的相应XML在磁盘上是最新的时,在内存中生成XML,哈希,并检查字典中的哈希值。如果类的名称不在字典中,或者其散列与字典中的散列不一致,则保留生成的XML并使用新散列更新字典。

在您使用所有类型完成此过程后,您将拥有一个完整的哈希字典。将其保留到磁盘并在下次运行此程序时加载它。