2011-11-23 1 views
9

J'essaie de sérialiser et de désérialiser un ReadOnlyCollection en utilisant protobuf-net. Cependant, une exception est lancée lors de la désérialisation lorsque protobuf-net tente de convertir une liste en une ReadOnlyCollection.protobuf-net: échec de désérialisation ReadOnlyCollection

 var roc = new ReadOnlyCollection<byte>(new byte[] {1, 2, 3}); 
     var ms = new MemoryStream(); 

     Serializer.Serialize(ms, roc); 
     ms.Position = 0; 
     var roc2 = Serializer.Deserialize<ReadOnlyCollection<byte>>(ms); 

     Console.WriteLine(BitConverter.ToString(roc2.ToArray())); 

Est-il possible de garder cela comme un ReadOnlyCollection plutôt que sérialisation/désérialisation comme List? Dans l'application réelle, le ReadOnlyCollection fait partie d'un objet immuable que je veux sérialiser, et je préférerais le garder comme ReadOnlyCollection.

+0

Ooh, c'est intrigant. * maintenant * Je devrais dire simplement "non ça ne marchera pas", mais je peux penser à quelques façons de le modifier pour le * faire * fonctionner. Ce serait toutefois des changements au cœur de la désérialisation. Vous pourriez vouloir enregistrer ceci comme demande de fonctionnalité sur protobuf-net. –

+0

J'ai ajouté un [problème] (http://code.google.com/p/protobuf-net/issues/detail?id=254) pour ce problème et une correction possible, mais j'ai oublié de changer le type de problème. répertorié comme un défaut. Doh! – Mark

+0

J'ai vu. Merci. J'y viendrai, mais gardez à l'esprit que protobuf-net n'est pas mon travail de jour - il faudra peut-être quelques jours pour l'examiner de près. –

Répondre

0

Je pense que protobuf-net ne désérialise les collections que dans la liste. Vous pouvez:

var roc2aux = Serializer.Deserialize<List<byte>>(ms); 
var roc2 = new ReadOnlyCollection<byte>(roc2aux); 
Console.WriteLine(BitConverter.ToString(roc2.ToArray())); 
Questions connexes