2010-12-06 5 views
5

J'ai un très complexe web d'objets que je voudrais sérialiser et désérialiser dans un environnement non fiable (navigateur web, en utilisant Unity 3D). La sérialisation BinaryFormatter fonctionne correctement, mais la désérialisation se bloque avec des erreurs "d'accès au champ privé". Cela fonctionne parfaitement quand je cours localement.Stratégie de désérialisation non fiable

Je préfère ne pas rendre mon code de base nul en rendant tous mes champs privés publics. Quel est le meilleur moyen de faire fonctionner la désérialisation dans un environnement non sécurisé sans faire cela? Je suis ouvert à l'évolution des méthodes de sérialisation, BinaryFormatter était le plus facile à démarrer.

MISE À JOUR Je ne veux pas empêcher sérialisation d'accéder à mes données privées, je veux permettre sérialisation d'accéder à mes données personnelles sans avoir à le rendre public, compromettre l'encapsulation de mon code.

Merci.

+0

est-ce une application asp.net? – TalentTuner

+0

@Saurabh, no. C'est unity3d, un plugin de navigateur qui tourne .NET. – luqui

Répondre

0

Eh bien, si vous voulez empêcher l'accès au champ privé par sérialisation, vous voudrez peut-être passer à la sérialisation Xml de la sérialisation JSON, peut-être même. Vous pouvez empêcher la sérialisation des champs privés en leur attribuant des attributs NonSerializaed, mais vous risquez de rencontrer des problèmes lorsque les développeurs attendent que leurs champs contiennent des valeurs valides et ne tiennent pas compte du fait que ces valeurs de champ sont perdues lors du transfert au plugin Unity.

+0

(en ajoutant '[NonSerialized]') Cela signifierait bien sûr qu'il n'a pas vraiment sérialisé quoi que ce soit - à moins que je ne vous comprenne mal –

+0

Non, vous n'avez pas mal compris. Comme je l'ai mentionné, les valeurs des champs non sérialisés sont perdues et nécessitent une attention particulière dans les scénarios où un modèle de commande de niveau inférieur est utilisé ou, dans le scénario le plus probable, un basculement vers Json ou Xml Serialization. – Anton

2

Sérialiseurs aiment XmlSerializer et JavaScriptSerializer travail contre les membres du public, de sorte qu'ils devraient (croix doigts) travaillent en termes de acceptablement confiance. Vous pouvez également essayer protobuf-net si vous voulez binaire - mais je n'ai pas testé agressivement ce scénario (cela fonctionne dans des choses comme Silverlight, cependant, qui a un modèle de confiance assez pointilleux).

Si vous voulez coller avec BinaryFormatter mais ne le voulez pas en touchant directement vos champs, vous pouvez implémenter ISerializable, mais le faire manuellement est ... douloureux.

1

Aucune des réponses n'a vraiment répondu à ma question (voir la mise à jour pour plus de précisions). J'ai fini par écrire mon propre format de sérialisation simple en utilisant BinaryWriter. À la fin, j'ai réalisé que ce que j'ai fait était équivalent à l'implémentation manuelle de l'interface ISerializable pour mes classes. J'ai dû mettre en œuvre manuellement le code graphe serializatoin. Bien que ce ne soit pas difficile, c'est un peu subtil, et cela a déjà été fait pour moi. Pour les futurs perople avec cette question, s'il n'y a pas de meilleures réponses, je recommande d'implémenter manuellement ISerialzable.