Question

Je sérialisation plusieurs objets dans un seul flux, mais lorsque je tente de les relire, je ne peux pas sembler obtenir quoi que ce soit, mais le dernier objet:

ProtoBuf.Serializer.Serialize(stream, postA1);
ProtoBuf.Serializer.Serialize(stream, postB1);
stream.Position = 0;
var postA2 = ProtoBuf.Serializer.Deserialize<Post>(stream);
var postB2 = ProtoBuf.Serializer.Deserialize<Post>(stream);

Le premier désérialiser le flux se déplace à la fin et postA2 contient la valeur de PostB1, tandis que postB2 est juste un exemple non initialisé. Est-ce comportement attendu, et si oui, comment désérialiser-vous un objet à partir d'une position aléatoire dans un flux?

Était-ce utile?

La solution

Par default , protobuf (la spécification Google, pas proobuf net spécifiquement) est conçu pour vous permettre de traiter des messages consécutifs dans le cadre d'un seul objet - à dire que vous pouvez ajouter des champs à un message simple en concaténant, qui est essentiellement ce que vous faites ici. Chaque objet de haut niveau n'a pas (par défaut) ont une sorte de séparation de l'objet suivant.

Pour obtenir de les traiter comme des objets différents, regardez les méthodes de *WithLengthPrefix (ou vous pouvez utiliser les versions IEnumerable<T> - peut-être DeserializeItems, note également qu'il appliquera préfixes longueur automatiquement si vous lui donnez quelque chose comme une liste de sérialisation) ; par exemple:

Pour l'essentiel:

Serializer.SerializeWithLengthPrefix(stream, postA1, PrefixStyle.Base128, 1);
Serializer.SerializeWithLengthPrefix(stream, postB1, PrefixStyle.Base128, 1);
stream.Position = 0;
var postA2 = Serializer.DeserializeWithLengthPrefix<Post>(stream,
    PrefixStyle.Base128, 1);
var postB2 = Serializer.DeserializeWithLengthPrefix<Post>(stream,
    PrefixStyle.Base128, 1);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top