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

我们为大量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文件并解析公共类< classname>并将其映射到每种类型.这似乎是一个巨大的开销,并不确定它是否是一个可靠的方法.

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

最佳答案 将内存中的XML生成与将其持久保存到磁盘分开.

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

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

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

点赞