2010-02-02 10 views
9

que tienen esta clase:¿Hay alguna manera de evitar que el XmlSerializer no inicialice una propiedad nula al deserializar?

public class MySerializableClass 
{ 
    public List<MyObject> MyList { get; set; } 
} 

Si Mi lista es nula cuando MySerializableClass es serializado, necesito tener nulo cuando se deserialised también, pero el XmlSerializer siempre lo inicializa cuando se deserialises mi clase.

¿Hay alguna manera de evitar que se inicialicen las propiedades nulas?

MyList ni siquiera está registrado en el archivo serializado cuando es nulo. Cuando lo cargo con valores nulos y lo vuelvo a guardar, MyList ya no es nulo, se serializa como una lista <> con 0 elementos, pero no es nulo.

Gracias.

Más información:

propiedad

Un IsDeserializing no es viable debido a algunas restricciones de código en la estructura de la clase

+0

Wow, System.XML nunca se apodera de sorprenderme. Tener un public setter para un miembro de la clase de colección es * muy * inusual, revise su diseño para verificar que eso es lo que realmente desea. Funciona bien sin un setter. –

+2

No es lo que realmente quiero. Es lo que quiere el serializador. Si hago que el get o el set sean privados, el deserializador fallará. – Carlo

Respuesta

8

Esto parece un error ...

Incluso si intenta marcar la propiedad como nulable, no parece funcionar.

[XmlArray(IsNullable = true)] 
public List<MyObject> MyList { get; set; } 

serializa la propiedad Mi lista de la siguiente manera:

<MyList xsi:nil="true" /> 

Así que el XML indica claramente que la lista es nula, pero después de deserialización, todavía es inicializado a una lista vacía ...

Si reemplaza List<MyObject> con MyObject[], que funciona bien (incluso sin IsNullable = true), pero probablemente no es lo que quiere ...

Probablemente deberías informar esto en Connect.

+1

Una vez que haya informado del error, edite su pregunta para incluir la URL del informe de error. Eso permitirá que otros voten por el error. –

+1

Por favor, vote y agregue algunos comentarios aquí https://connect.microsoft.com/VisualStudio/feedback/details/687096/xmlserializer-initializes-a-list-when-it-should-not –

0

No utilice Propiedades autoejecutables si necesita un nulo allí. uso, p.

public class MySerializableClass 
{ 
    List<MyObject> myList 
    public List<MyObject> MyList { get {return myList;} set {myList = value;} } 
} 
+1

No soluciona el problema, pruébelo. –

+0

Sí, de hecho lo tengo así, lo simplifiqué para el ejemplo, pero gracias por la sugerencia. – Carlo

0

he tenido el mismo problema, pero la adición de la XmlArrayAttribute a la propiedad sin nada conjunto compuesto que funcione para mí

public class MySerializableClass 
{ 
    [XmlArray] 
    public List<MyObject> MyList { get; set; } 
} 
+0

¡No funciona para mí! –

0

Si se agrega una propiedad con el nombre * PropertyName * Se especifica como un valor lógico de la XmlSerializer representará la etiqueta de la lista solo cuando sea verdadera.

Ejemplo:

public class MySerializableClass 
{ 
    public List<MyObject> MyList { get; set; } 

    [XmlIgnore] 
    public bool MyListSpecified { get; set; } 
} 
+0

No funciona, intenté en 4.0 – annakata

Cuestiones relacionadas