serialize serializar deserialize deserializar and wcf datacontractserializer

wcf - serializar - serialize and deserialize c#



WCF Datacontract, algunos campos no se deserializan (2)

Los campos están en el orden incorrecto para su mensaje. DataContracts predeterminado a ordenamiento alfabético y no a orden de declaración; y espera que los elementos XML lleguen en ese orden; Los elementos fuera de servicio se descartan por lo general.

Arregle su contrato para especificar el orden correcto explícitamente (usando la propiedad Order del DataMemberAttribute) o asegúrese de que su cliente los envíe en el correcto.

Problema:

Tengo una configuración de servicio WCF para ser un punto final para una llamada desde un sistema externo. La llamada está enviando xml simple. Estoy probando el sistema enviando llamadas al servicio desde Fiddler usando RequestBuilder.

El problema es que todos mis campos están siendo deserializados con la excepción de dos campos. price_retail y price_wholesale .

¿Qué me estoy perdiendo? Todos los demás campos se deserializan sin problemas: el servicio responde. Es solo estos campos.

Mensaje XML:

<widget_conclusion> <list_criteria_id>123</list_criteria_id> <list_type>consumer</list_type> <qty>500</qty> <price_retail>50.00</price_retail> <price_wholesale>40.00</price_wholesale> <session_id>123456789</session_id> </widget_conclusion>

Método de servicio:

public string WidgetConclusion(ConclusionMessage message) { var priceRetail = message.PriceRetail; }

Clase de mensaje:

[DataContract(Name = "widget_conclusion", Namespace = "")] public class ConclusionMessage { [DataMember(Name = "list_criteria_id")] public int CriteriaId { get; set;} [DataMember(Name = "list_type")] public string ListType { get; set; } [DataMember(Name = "qty")] public int ListQuantity { get; set; } [DataMember(Name = "price_retail")] public decimal PriceRetail { get; set; } [DataMember(Name = "price_wholesale")] public decimal PriceWholesale { get; set; } [DataMember(Name = "session_id")] public string SessionId { get; set; } }


Puede intentar usar XmlSerializer en lugar de DataContractSerializer. En mi caso, necesito cambiar el motor predeterminado en el archivo global.asax:

var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;

Haga esto con cuidado porque algunos XML pueden no ser válidos, por ejemplo, espacios de nombres, con XmlSerializer debe determinarse como:

[XmlNamespaceDeclarations] private XmlSerializerNamespaces xmlns { get { var xns = new XmlSerializerNamespaces(); xns.Add("i", "http://www.w3.org/2001/XMLSchema-instance"); return xns; } set { } }

O puede establecer XmlSerializerFormatAtrribute en su clase (no funciona para mí). Consulte en la cabecera de la url "Cambiar manualmente al XmlSerializer"