2009-10-30 7 views
11

Mi SomeClassDataContractSerializer no deserializar correctamente, los valores para los métodos de objeto faltan

[Serializable] 
[DataContract(Namespace = "")] 
public class SomeClass 
{ 
    [DataMember] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember] 
    private IDictionary<long, string> customValues; 
    public IDictionary<long, string> CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 

mi archivo XML:

<?xml version="1.0" encoding="UTF-8"?> 
<SomeClass> 
<FirstName>John</FirstName> 
<LastName>Smith</LastName> 
<CustomValues> 
    <Value1>One</Value1> 
    <Value2>Two</Value2> 
</CustomValues > 
</SomeClass> 

Pero mi problema es que la clase, yo sólo estoy recibiendo algunos de los datos de mis métodos cuando me deserializo

var xmlRoot = XElement.Load(new StreamReader(
        filterContext.HttpContext.Request.InputStream, 
        filterContext.HttpContext.Request.ContentEncoding)); 
XmlDictionaryReader reader = XmlDictionaryReader.CreateDictionaryReader(xmlRoot.CreateReader()); 
DataContractSerializer ser = new DataContractSerializer(typeof(SomeClass)); 
//Deserialize the data and read it from the instance. 
SomeClass someClass = (SomeClass)ser.ReadObject(reader, true); 

Así que cuando puedo comprobar "algunaClase", Nombre tendrá el valor Juan, pero el Apellido será nulo.

Misterio es cómo puedo obtener algunos de los datos y no todos los datos de la clase. Entonces DataContractSerializer no está sacando todos los datos de xml al deserializar.

Estoy haciendo algo mal.

Cualquier ayuda es apreciada. Gracias por adelantado.

Déjame saber si alguien tiene el mismo problema o cualquiera tiene solución

+1

no debería DataMember attr estar en la propiedad pública y no en el privado? – Dani

Respuesta

16

Bueno he encontrado mi propio contestador después de jugarlo mucho alrededor .... tiene que ser en un orden alpahbetical. por lo que si la clase tiene

[Serializable] 
[DataContract(Namespace = "")]  
public class SomeClass 
{ 
    [DataMember] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember] 
    private IDictionary<long, string> customValues; 
    public IDictionary<long, string> CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 

continuación XML debe definir en orden alfabético.

<?xml version="1.0" encoding="UTF-8"?> 
<SomeClass> 
<CustomValues> 
    <Value1>One</Value1> 
    <Value2>Two</Value2> 
</CustomValues > 
<FirstName>John</FirstName> 
<LastName>Smith</LastName> 
</SomeClass> 

bien ¿por qué la h ... tiene que estar en orden alfabético?

+1

'Rendimiento' aparentemente. ¡Locura! –

+0

Gracias por publicar esta increíble pieza de conocimiento. He estado haciendo headbanging con el mismo código que 'casi' funciona durante horas. Cambio de esquema rápido y funciona como un regalo. Debe preguntarse por qué esto no está más claramente documentado en el producto. +1 –

+1

Guau, también perdí horas tratando de encontrar la solución a esto. Esto causa algunos problemas graves si un servicio web devuelve elementos XML en un orden diferente al de la especificación WSDL; en este caso, el proxy generado por SvcUtil tendrá un orden incorrecto y la deserialización fracasará silenciosamente. – Oenotria

13

Para eso está el atributo Order; Si no tiene control sobre el XML que deserializa, esa es la única solución que conozco.

En el primer ejemplo que sería

[Serializable] 
[DataContract(Namespace = "")] 
public class SomeClass 
{ 
    [DataMember(Order = 0)] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember(Order = 1)] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember(Order = 2)] 
    private IDictionary customValues; 
    public IDictionary CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 
Cuestiones relacionadas