存储已更改对象的最小差异数据的最佳方法是什么?

时间:2011-04-12 15:44:15

标签: c# .net .net-4.0

我有一个对象,其中包含许多数据类型的属性,这些属性是搜索大型缓存的设置。我想从基本设置和仅更改中传递此对象上已更改的值。我也希望将这些信息作为一个非常短的字符串传递给我。

所以我需要的是在C#.NET 4中执行此操作的技术(后面是伪代码):

var changes = Diff(changedobject, baseobject);
return changes.ToShortString()

以及后来只知道对象的远程机器

var changedobject = CreateObject(diffstring)

非常感谢任何想法。

由于

2 个答案:

答案 0 :(得分:2)

我没有适合你的代码,但这应该很清楚

  

创建一个使用的元数据类   反射,得到的属性   对象并缓存getter方法   每。然后对于每个属性,它确实如此   如果它是一个复杂的属性,相同,   等...所以你得到一个对象图   类似于你的班级。然后呢   传递了两个相同类型的对象,   这递归循环遍历   元数据和调用getter以便   比较并返回结果。您   也可以通常输入。

实现将是这样的:

public class Metadata<T>
{
    private Dictionary<string, Metadata<T>> _properties = new Dictionary<string, Metadata<T>>();
    private MethodInfo _getter;

    private void BuildMetadata()
    {
        Type t = typeof (T);
        foreach (PropertyInfo propertyInfo in t.GetProperties())
        {
            // ....
        }
    }
}

答案 1 :(得分:1)

CSLA.NET框架使用反射来遍历类型的属性和字段,并将它们写入哈希表。然后将此哈希表序列化并存储。

在CSLA.NET项目中,该类型称为UndoableBase

我不记得它是否记录了差异,但前提是您需要之前的状态副本(在CSLA案例中,这将是以前序列化的项目)。

假设您有一个项目的副本(实际复制,而不是引用)作为原始源,那么您可以使用反射来检查每个属性,并将其添加到哈希表中(如果已更改)。

通过网络发送此哈希表。

另一个以及我要看的更多内容,是为序列化项目添加前缀,表示即将发生的流中提供了哪些字段。这可能比名称值的哈希表更紧凑。您可以通过首先按字母顺序(或通过其他方式)对字段/属性进行排序,将其包含在您的反射解决方案中。但是,如果您将此序列化数据存储在该类型的各个版本中,则这不是版本容忍的。