2011-04-12 4 views
1

J'ai un objet qui contient beaucoup de propriétés, de nombreux types de données qui sont les paramètres pour une recherche d'un cache important. Je voudrais passer les valeurs qui ont été modifiées sur cet objet à partir des paramètres de base et seulement les changements. Je voudrais également passer cette information comme une chaîne très courte.Quelle est la meilleure façon de stocker les données différentielles minimales d'un objet modifié?

donc ce que j'ai besoin est une technique pour faire cela en C# .NET 4 (code pseudo ci-dessous):

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

et plus tard sur une machine distante qui ne connaît que l'objet

var changedobject = CreateObject(diffstring) 

Toutes les idées seraient très appréciées.

Merci

Répondre

1

Le cadre CSLA.NET utilise la réflexion pour parcourir les propriétés et les champs d'un type et les écrire sur une table de hachage. Cette table de hachage est ensuite sérialisée et stockée.

Le type est appelé UndoableBase dans le projet CSLA.NET.

Je ne me souviens pas si elle enregistre des différences, mais la prémisse est que vous avez besoin d'une copie de l'état avant (dans le cas de l'AAPC, ce serait l'élément précédemment sérialisé).

En supposant que vous avez une copie d'un élément (une copie réelle, pas une référence) comme source d'originaux, vous pouvez utiliser la réflexion pour vérifier chaque propriété et l'ajouter à la table de hachage si elle a changé.

Envoyez cette table de hachage sur le fil.

Une alternative et un que je voudrais regarder plus, est de préfixer votre élément sérialisé avec des drapeaux bit indiquant quels champs sont fournis dans le flux à venir. Cela sera probablement plus compact qu'une table de hachage de valeurs de nom. Vous pouvez inclure ceci dans votre solution de réflexion en triant d'abord les champs/propriétés par ordre alphabétique (ou par d'autres moyens). Cela ne sera pas tolérant à la version, cependant, si vous stockez ces données sérialisées à travers les versions du type.

2

Je n'ai pas un code pour vous, mais cela devrait être assez clair

Créer une classe de métadonnées qui utilisant la réflexion , obtient les propriétés de l'objet et met en cache la méthode getter de chacun. Puis pour chaque propriété, il fait la même chose si c'est une propriété complexe, etc ... donc vous obtenez un graphique d'objet similaire à votre classe. Ensuite, quand a passé deux objets du même type, cela boucle récursivement les métadonnées et appelle getter afin de comparer et renvoie le résultat. Vous pouvez également le faire générique.

implementaion serait quelque chose comme ceci:

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()) 
     { 
      // .... 
     } 
    } 
} 
Questions connexes