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

C# 在序列化类文件之前,如何检查类文件是否已更改?,c#,algorithm,C#,Algorithm,我们为大量C#类型提供了自定义序列化过程。但是,为所有类/类型重新生成所有序列化信息非常耗时,我们计划通过计算文件的哈希值来优化序列化过程,如果不同,我们将生成序列化输出,否则将跳过它编辑:我们可以将散列存储在字典中,可以将其输出到文件并在处理时重新读取。这是目前的想法 我们当前的序列化处理器的工作原理如下-我们将要序列化的类型添加到repo: SerializerRepo.Add(typeof(MyType)); //Add type to be serialized to a repo 然

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


  • 这是我仅有的两个想法,但没有具体的内容。建议?

    将在内存中生成XML与将其持久化到磁盘分开

    保留从完全限定类名到散列的字典。在您第一次运行时,字典将以空开头

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


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

    瓶颈在哪里?是序列化还是写入文件?我有一种感觉,不管怎样序列化和编写与打开文件和计算散列/比较将是一样昂贵和耗时的。可以在XML中存储哈希信息吗?可能有一个存储所有散列的索引文件?在某个地方,你必须在序列化时保留某种散列值,你不能将之前序列化的XML与类def进行比较并检查差异。使用类似PostSharp的方法,你可以对可序列化的类应用一个属性。然后在编译时,您可以让postsharp属性检查类的更改并生成哈希。@RonBeyer-瓶颈是
    WriteXML
    方法。它解析整个类文件并生成输出为XML的信息。将其扩展到1000多个文件,速度会变得非常慢。伪代码将是文本中有用的补充。