2011-06-04 2 views
1

Je voudrais pouvoir mettre à jour des objets en sérialisant/désérialisant seulement le champ qui a changé. J'utilise la version non générique du sérialiseur puisque je ne connais pas le type à la compilation. À l'exécution, j'ai le type cependant.Peut-on partiellement sérialiser un objet en utilisant Protobuf-net?

Localement Je veux faire quelque chose comme:

var existingObject.SomeField = 10; 

// Say I only want to serialize field B 
byte[] serializedField = SerializeField(existingObject, "SomeField") 

Remotely Je désérialiser et créer un nouvel objet:

Merge(serializedField, existingObject); 

Il ne semble pas être un moyen de le faire en utilisant le non générique interface?

Répondre

1

Vous avez quelques options ici.

Si votre type connaît en interne ce qui a changé, vous pouvez utiliser le même modèle que XmlSerializer (IIRC), I.e.

[ProtoMember(12)] 
public string Foo {get;set;} 

public bool ShouldSerializeFoo() { 
    return ... true if Foo is dirty 
} 

La deuxième option consisterait à créer le modèle à la volée, et à lui indiquer uniquement les membres qui ont été modifiés. Cependant, étant donné que par défaut cela entraînerait (au fil du temps) la génération d'un grand nombre de code dynamique, vous pouvez donc définir AutoCompile sur fse pour ce cas.

Une troisième option consisterait à sérialiser manuellement via ProtoWriter. Cela nécessite probablement plus de savoir-faire en protobuff que ce qui est souhaitable.

+0

Merci Marc. Le modèle ShouldSerialize serait utile. Dire que je pourrais l'obtenir pour sérialiser partiellement cependant. Comment désérialiser? Voici le problème que j'ai. Je sérialise un objet avec des valeurs par défaut à l'exception d'un seul champ que j'ai défini. Plus tard, je veux réinitialiser l'objet à distance par défaut en lui envoyant le nouvel objet vide sérialisé. L'objet mis à jour est très petit car aucun champ n'est défini. Fusionner ceci dans l'original n'a aucun effet. Mon intention est de mettre le champ à zéro. Donc, vraiment, je veux désérialiser dans un objet existant, mais effacer les champs existants en premier. – Johan

+0

@Johan - ne suit pas entièrement. Si vous voulez dire "comment charger les changements dans un objet existant", c'est ce que 'Merge' est pour - ou, dans v2 - juste passer cet objet dans' Deserialize'. –

Questions connexes