【问题标题】:How do I check if a class file has been changed before serializing it?如何在序列化之前检查类文件是否已更改?
【发布时间】: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 没有从类型到类文件的任何此类映射,反之亦然。但是,我们没有任何部分类。但在我们的例子中,我们似乎需要两条(尽管不相关的)信息——包含类型/类的文件和类型本身。

到目前为止有两个(可能不是最佳的)想法:

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

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

这是我仅有的两个想法,但没有具体的想法。有什么建议吗?

【问题讨论】:

  • 瓶颈在哪里?是序列化,还是写入文件?我有一种感觉,无论如何序列化和写入与打开文件和计算哈希/比较将同样昂贵和耗时。您可以在 XML 中存储哈希信息吗?也许有一个存储所有哈希的索引文件?
  • 在某个地方,您必须在序列化时保留某种哈希值,以便稍后与它进行比较。
  • 你不能将之前序列化的 XML 与类 def 进行比较并检查差异。
  • 使用 PostSharp 之类的东西,您可以将属性应用于可序列化的类。然后在编译时你可以让 postsharp 属性检查类的变化并生成你的哈希。
  • @RonBeyer - 瓶颈是WriteXML 方法。它解析整个类文件并生成输出到 XML 中的信息。将其扩展到大约 1000 多个文件,它会变得非常慢。

标签: c# algorithm


【解决方案1】:

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

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

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

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

【讨论】:

  • 伪代码对文本很有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多