Tag: 补丁

ASP.NET Web API 2和部分更新

我们正在使用ASP.NET Web API 2并希望以下列方式公开部分编辑某些对象的能力: HTTP PATCH / customers / 1 { “firstName”: “John”, “lastName”: null } …将firstName设置为”John” ,将lastName为null 。 HTTP PATCH / customers / 1 { “firstName”: “John” } …只是为了将firstName更新为”John”并且根本不触及lastName 。 假设我们有很多属性要用这种语义更新。 这是OData行使的非常方便的行为。 问题是默认的JSON序列化器在这两种情况下都会出现null ,因此无法区分。 我正在寻找一些方法来使用某种包装器(带有值和标志设置/未设置)来注释模型,这样可以看到这种差异。 任何现有的解决方案?

C#中的二进制补丁生成

有没有人知道或者知道C#中的二进制补丁生成算法实现? 基本上,比较两个文件(指定旧的和新的 ),并生成一个补丁文件,可用于升级旧文件以具有与新文件相同的内容。 实现必须相对较快,并使用大文件。 它应该表现出O(n)或O(logn)运行时。 我自己的算法往往是糟糕的(快速但产生巨大的补丁)或缓慢(产生小补丁但具有O(n ^ 2)运行时)。 任何建议或实施指针都会很好。 具体来说,该实现将用于使我们拥有一个主服务器的各种大型数据文件保持服务器同步。 当主服务器数据文件发生更改时,我们还需要更新多个场外服务器。 我所做的最天真的算法,仅适用于可以保存在内存中的文件,如下所示: 从旧文件中获取前四个字节,将其称为密钥 将这些字节添加到字典中,其中key – > position ,其中position是我抓住那4个字节的位置,0开始于 跳过这四个字节中的第一个,抓取另外4个(3个重叠,1个),并以相同的方式添加到字典中 对旧文件中的所有4字节块重复步骤1-3 从新文件的开头,抓取4个字节,并尝试在字典中查找它 如果找到,通过比较两个文件中的字节,找到最长匹配(如果有) 在旧文件中对该位置的引用进行编码,并跳过新文件中的匹配块 如果未找到,则从新文件中编码1个字节,然后跳过它 对新文件的其余部分重复步骤5-8 这有点像压缩,没有窗口,因此会占用大量内存。 然而,它是相当快的,并且产生非常小的补丁,只要我尝试使代码输出最小。 更节省内存的算法使用窗口,但会产生更大的补丁文件。 我在本文中跳过了上述算法的细微差别,但如果有必要,我可以发布更多详细信息。 但是,我觉得我需要一个完全不同的算法,因此改进上述算法可能不会让我足够远。 编辑#1 :以下是对上述算法的更详细描述。 首先,组合这两个文件,这样你就有了一个大文件。 记住两个文件之间的切点。 其次,这样做可以获取4个字节并将其位置添加到整个文件中的所有内容的字典步骤中。 第三, 从新文件开始的位置开始,尝试定位4字节的现有组合,并找到最长匹配。 确保我们只考虑旧文件中的位置,或者新文件中较早的位置 。 这确保了我们可以在补丁应用程序中重用旧文件和新文件中的材料。 编辑#2 : 上述算法的源代码 您可能会收到有关证书存在问题的警告。 我不知道如何解决这个问题,因此暂时接受证书。 源使用了我库中其余部分的许多其他类型,因此文件不是全部​​,但这就是算法实现。 @lomaxx,我试图为subversion中使用的算法找到一个很好的文档,叫做xdelta,但除非你已经知道算法是如何工作的,否则我发现的文件无法告诉我需要知道的内容。 或者也许我只是密集…… 🙂 我快速浏览了你所提供的网站上的算法,遗憾的是它无法使用。 二进制diff文件中的注释说: 找到一组最佳差异需要相对于输入大小的二次时间,因此它很快就会变得无法使用。 我的需求并不是最优的,所以我正在寻找更实用的解决方案。 谢谢你的回答,如果我需要它,他会为他的工具添加一个书签。 编辑#1 […]