2010-12-06 11 views
5

Tengo una red bastante compleja de objetos que me gustaría serializar y deserializar en un entorno no confiable (navegador web, usando Unity 3D). La serialización BinaryFormatter está funcionando bien, pero la deserialización se bloquea con errores de "acceso a campos privados". Funciona perfectamente cuando estoy ejecutando localmente.Estrategia de deserialización no confiable

Prefiero no hacer que mi base de código sea mala haciendo públicos todos mis campos privados. ¿Cuál es la mejor manera de lograr que la deserialización funcione en un entorno no confiable sin hacer esto? Estoy abierto a cambiar los métodos de serialización, BinaryFormatter fue el más fácil de empezar.

ACTUALIZACIÓN no quiero para evitar la serialización de acceder a mis datos privados, quiero permiten la serialización para acceder a mis datos privados sin tener que hacerlo público, poniendo en peligro la encapsulación de mi código.

Gracias.

+0

¿es esta una aplicación asp.net? – TalentTuner

+0

@Saurabh, no. Es unity3d, un complemento de navegador que ejecuta .NET. – luqui

Respuesta

0

Bueno, si desea evitar el acceso privado al campo por serialización, es posible que desee pasar a la serialización Xml de quizás incluso la serialización Json.

Puede evitar que los campos privados se serialicen colocando atributos no serializados en ellos, pero puede tener problemas cuando los desarrolladores esperan que sus campos contengan valores válidos y no tengan en cuenta el hecho de que esos valores de campo se pierden cuando se transfieren al plugin de Unity

+0

(agregando '[NonSerialized]') Eso, por supuesto, significa que realmente no serializa nada, a menos que no te entienda –

+0

No, no entendiste mal. Como mencioné, los valores en campos no serializados se pierden y eso requiere una atención seria en escenarios donde se usa algo así como un patrón de comando de bajo nivel, o en el escenario más probable, un cambio a la serialización Json o Xml. – Anton

2

Serializadores gusta XmlSerializer y JavaScriptSerializer trabajo en contra de los miembros del público, por lo que debe (cruza los dedos) funciona de manera aceptable en términos de confianza. También puedes probar protobuf-net si quieres binario, pero no he probado agresivamente este escenario (aunque funciona en cosas como Silverlight, que tiene un modelo de confianza bastante exigente).

Si quiere seguir con BinaryFormatter pero no quiere que toque sus campos directamente puede implementar ISerializable, pero hacerlo todo manualmente es ... doloroso.

1

Ninguna de las respuestas realmente respondió mi pregunta (ver la actualización para aclarar). Terminé escribiendo mi propio formato de serialización simple usando BinaryWriter. Al final me di cuenta de que lo que hice fue equivalente a implementar manualmente la interfaz ISerializable para mis clases. Tuve que implementar manualmente el código de serialización del gráfico. Aunque no es difícil, es un poco sutil, y ya se ha hecho por mí. Para futuras personas con esta pregunta, si no hay mejores respuestas, recomiendo implementar manualmente ISerialzable.

Cuestiones relacionadas