2011-03-02 37 views
8

Estoy utilizando la serialización xml pero ahora encontré un error de tiempo de ejecución que no había visto antes.¿Por qué XmlSerializer requiere tipos que hereden de IEnumerable tener una implementación de Add (System.Object)?

"Para ser XML serializable, tipos, que hereda de IEnumerable debe tener una implementación de Añadir (System.Object) en todos los niveles de su herencia jerarquía. ImageEditor.EffectOptions no implementa Añadir (Sistema .Object) "

Parece un poco extraño estar obligado a implementar un método a través de la excepción de tiempo de ejecución, en lugar de errores de tiempo de compilación, como métodos faltantes de las interfaces implementadas.

¿Esto es por diseño? ¿No debería aplicarse esto a través de algún tipo de interfaz como XmlSerializable, etc.?

Aparte de esto me pregunto si el serializador garantiza pasar un valor del tipo correcto donde puedo simplemente convertirlo al tipo, que en mi caso es EffectOption.

¿O debería implementar este método Add (object) para ver si el objeto es del tipo EffectOption y si no se lanza una excepción?

No he implementado este método Add (object) anteriormente pero supongo que es más seguro simplemente echarlo a EffectOption y agregarlo a la colección EffectOptions.

EDIT: Aquí está el propio tipo:

public class EffectOptions : IEnumerable<EffectOption> 
{ 
    public List<EffectOption> Options { get; private set; } 

    //IEnumerable methods 
} 

Respuesta

3

Dado que las clases sub implícitamente implementan métodos de interfaz a causa de la clase base, pero XmlSerializer está utilizando la reflexión y es por eso que se obtiene el error en tiempo de ejecución y no en tiempo de compilación.

Trate de implementar explícitamente y vea qué sucede. No he tenido este problema antes, así que no estoy seguro de por qué lo haces a menos que estés haciendo algo personalizado.

Si sus subclases implementan explícitamente la interfaz pero no implementan ningún código de implementación (permitiendo la implementación implícita de los métodos), elimine la interfaz de su declaración de subtipo, ya que aún debe ser válida debido a su tipo base. (Que alguien me diga si estoy fuera de aquí)

+0

Gracias, pero ¿qué quieres decir con subclases? Mi tipo no se deriva de ningún otro tipo, simplemente implementa IEnumerable. –

+0

¿Puedes publicar la clase con los apéndices del método? –

+0

Agrega el código a la pregunta. –

2

yo sólo he encontrado con este problema y lo resolvió mediante la adición de un método Add:

public class EffectOptions : IEnumerable<EffectOption> 
{ 
    public List<EffectOption> Options { get; private set; } 

    public void Add(object o){ 
     this.Options.Add(o as EffectOption); //you may want to extend the code to check that this cast can be made, 
              //and throw an appropriate error (otherwise it'll add null to your list) 
    } 

    //IEnumerable methods 
} 

espero que esto ayude.

Cuestiones relacionadas