serializacion - serializar objeto c#
WCF: ¿Hay alguna manera de eliminar el campo ExtensionData? (8)
Su clase no debe heredar IExtensibleDataObject.
Por favor refiérase a la descripción de la Ronda de disparo a continuación:
El disparo redondo se produce cuando los datos se transfieren de una versión nueva a una versión antigua y se transfieren a la nueva versión del contrato de datos. El bypass garantiza que no se pierdan datos. La desactivación de la derivación hace que el tipo a continuación sea compatible con cualquier cambio futuro admitido por el modelo de versión del contrato.
Para habilitar el disparo de disparo para un tipo particular, el tipo debe ejecutar el
IExtensibleDataObject
interfaz.
La interfaz de usuario contiene un atributo ExtensionData (ExtensionDataObject). La propiedad almacena cualquier información de futuras versiones del contrato de datos que sea desconocida para la versión actual.
Acabo de comenzar a usar WCF y ya llegué a un problema de modificación de proyecto. Creé un servicio y lo puse como referencia en un servicio web, pero cada campo en el archivo xml del servicio web viene con un campo ExtensionData.
Ejemplo:
eliminado link de ImageShack muerto
No quiero esto Necesito que sea solo:
eliminado link de ImageShack muerto
¿Hay alguna manera de eliminar este campo? ¿Algún tipo diferente de serialización?
Establecer la propiedad en null
evita que aparezca en el xml resultante:
foreach(var elem in arrayOfElements)
{
elem.ExtensionData = null;
}
ExtensionData es en realidad una característica que debe estar integrada en el tipo para habilitar round-tripping . Siempre es emitido por el DataContractSerializer. Una posible forma de suprimir este campo es usar el XmlSerializer anterior decorando la interfaz de su contrato de servicio con el XmlSerializerFormatAttribute .
ExtensionData se usa para mantener la compatibilidad entre servicios que pueden compartir contratos de diferentes versiones. Se puede ignorar de forma segura al pasar mensajes.
Es posible que pueda deshacerse de él utilizando algo que no sea el serializador DataContract (estoy pensando en la vieja escuela [Serializable]), pero podría estar equivocado.
No contesto la pregunta, pero tal vez esto ayude ...
De MSDN round-tripping :
La función de disparo redondo se puede desactivar, ya sea configurando ignoreExtensionDataObject en true en el constructor DataContractSerializer o configurando la propiedad IgnoreExtensionDataObject en true en el atributo ServiceBehavior. Cuando esta función está desactivada, el deserializador no completará la propiedad ExtensionData y el serializador no emitirá el contenido de la propiedad.
Si su problema se encuentra en una afirmación de un [Método de prueba], puede usar http://www.fluentassertions.com para excluir todas las propiedades de ExtensionData de sus aserciones.
P.ej.
objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData));
decorar su implementación de servicio con [ServiceBehavior (IgnoreExtensionDataObject = true)]
[ServiceBehavior(IgnoreExtensionDataObject=true)]
public class Service : IService {}
Lo más probable es que sus clases de DataContract implementarán la interfaz IExtensibleDataObject
, ¿verdad? Es responsable del campo ExtensionData
: simplemente elimine esa interfaz y también debería poder eliminar los campos ExtensionData
de sus DataContracts.
Bagazo