繁体   English   中英

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

[英]What's the best way to store the minimum differential data of a changed object?

我有一个对象,其中包含许多属性,许多数据类型,这是用于搜索大型缓存的设置。 我想通过基本设置和仅更改来传递已在此对象上更改的值。 我也想将此信息作为很短的字符串传递。

因此,我需要的是一种在C#.NET 4中执行此操作的技术(后接伪代码):

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

然后在只知道对象的远程机器上

var changedobject = CreateObject(diffstring)

任何想法将不胜感激。

谢谢

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

创建一个元数据类,该元数据类使用反射来获取对象的属性并缓存每个对象的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())
        {
            // ....
        }
    }
}

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

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

我不记得它是否记录了差异,但前提是您之前需要状态副本(在CSLA情况下,这是先前序列化的项目)。

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

通过网络发送此哈希表。

另一种方法 ,也是我要看的更多方法,是在序列化项目的前面加上位标志,以指示即将到来的流中将提供哪些字段。 这可能比名称值的哈希表更紧凑。 您可以通过首先按字母顺序(或通过其他方式)对字段/属性进行排序,将其包括在反射解决方案中。 但是,如果您在类型的不同版本之间存储此序列化数据,则该版本将不受版本限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM