2010-04-03 18 views
6

Entiendo cómo XMLSerializer podría funcionar al usar la reflexión para descubrir qué campos de lectura/escritura públicos o propiedades debería usar para serializar o deserializar XML. Sin embargo, XMLSerializer requiere que los campos sean públicos y de lectura/escritura.¿Cómo escribe DataContractSerializer en campos privados?

Sin embargo, DataContractSerializer puede leer o escribir desde o hacia campos completamente privados en una clase. Así que me pregunto cómo esto es posible incluso sin otorgar explícitamente a DataContractSerializer derechos de acceso adicionales a mi (s) clase (s).

Respuesta

7

La reflexión tiene muchas características. XmlSerializer tiene, a través de "sgen.exe" la capacidad de precompilar el código de serialización a un archivo binario (dll). Esto es útil en algunos escenarios que no permiten el código dinámico, pero los dlls (al igual que su código) están limitados a la API accesible.

Sin embargo ... la reflexión no es esta limitada, y con suficiente acceso puede hacer casi cualquier cosa. Para el rendimiento, probablemente no desee utilizar el reflejo directamente, pero si tiene permisos suficientes para crear IL directamente en la memoria (DynamicMethod), entonces puede decirlo (por método dinámico) que Type con el que está asociado el código. Por ejemplo, si creo un DynamicMethod pasando typeof(Foo) como el argumento owner, entonces ese método dinámico tiene acceso completo a todos los miembros (incluidos los campos) en Foo. Para obtener información, Delegate.CreateDelegate proporciona un acceso similar a los datos protegidos. Como DataContractSerializer no se preocupa por la pregeneración, puede usar este acceso.

2

Lo hace de la misma manera que el XMLSerializer, mediante el uso de la reflexión.

La diferencia es que XMLSerializer no tocará los campos privados, pero el DataContractSerializer lo hará.

Ver this SO preguntas y respuestas sobre la reflexión y el cambio de campos privados.

Cuestiones relacionadas