2011-09-20 3 views
8

L'existence de l'option AsReference dans Protobuf-net et le mot que BinaryFormatter est un "sérialiseur graphique" m'amènent à supposer que BinaryFormatter ne conserve pas de références et qu'il fait une copie de chaque objet.Intégrité de référence dans BinaryFormatter

Mais j'ai fait quelques tests et découvert que toutes les références dans un seul appel BinaryFormatter Serialize() ou Deserialize() sont maintenues même pour le référencement récursif. Puis-je confirmer que BinaryFormatter gère effectivement les références? En quoi est-ce différent de Protobuf-net? On dirait que je comprends mal "sérialisation graphique"? Quoi d'autre dois-je faire attention?

Merci d'avance.

Répondre

7

tl; dr; version - BinaryFormatter préserve toujours les références.

Le fait que BinaryFormatter soit un "sérialiseur de graphe" est synonyme de "cela préserve les références", puisque c'est requis pour reproduire fidèlement un graphe. L'alternative est un arbre sérialiseur (ce qui est le plus d'entre eux, XmlSerializer, DataContractSerializer (sans option particulière activée), JavascriptSerializer et protobuf-net sans AsReference sont tous basés d'arbres). Les sérialiseurs d'arbre ne sauvegardent généralement pas les références (à moins qu'ils ne fonctionnent, par exemple, ce que fait DataContractSerializer si vous activez le mode graphique complet, ou si protobuf-net le fait avec AsReference). Les sérialiseurs d'arbres (sans Voodoo activé) ont tendance à exploser dans un désordre avec un modèle récursif, ce qui les rend faciles à repérer.