c# - cref - La salida de DataContractSerializer difiere entre.NET y Mono
remarks c# (2)
Quizás una solución es usar la aplicación svcutil para generar el proxy y luego usar el mismo proxy que es. http://tutorials.csharp-online.net/WCF_Essentials%E2%80%94Generating_the_Proxy
En general, creo que debería comenzar a usar el espacio de nombres del contrato de datos, ya que me ha ayudado varias veces a identificar los problemas de la versión de referencia. Es muy agradable tener una versión para la que se ejecuta el código con proxies. Pero esa es otra misión :)
Quizás al hacer la referencia, si puede agregar una referencia a la biblioteca pública que sostiene su interfaz, puede usar los tipos de reutilización de la configuración de referencia del servicio de los ensamblajes referenciados, lo que hará que no hagan sus propios tipos en la misma extensión.
Finalmente, se encuentra el archivo Show.svcmap visible de todos los archivos en una referencia de servicio, este xml contiene un elemento ''CollectionMappings'', que a menudo ha sido necesario especificar para que mi lista se comporte, en cuyo caso, este artículo ofrece información:
http://social.msdn.microsoft.com/Forums/vstudio/en-US/09eefbbc-bf63-4aa3-a0cb-01a9dbd7f496/problem-sharing-custom-collection-types-between-service-and-client
Esos son mis cinco centavos de sugerencias de depuración,
Aclamaciones
Estoy serializando los datos en una aplicación Mono para Android y los envío usando REST a un servidor .NET que escucha usando WCF. Hasta ahora esto ha funcionado bien, sin embargo, con este contrato de datos en particular, aunque el servidor no arroja errores, las listas dentro del contrato de datos aparecen como vacías.
Al usar Fiddler y crear dos proyectos con el mismo código, pude comparar la salida normal de .NET DataContractSerializer con la salida de la implementación de Mono de DataContractSerializer.
Salida de .NET:
<VisitDataContractEx xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts">
<_isDirty xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">true</_isDirty>
<_id xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.Domain" xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:internalValue>a7b97b48-d3a9-419d-9f4e-330ffc7a01ee</d2p1:internalValue>
</_id>
<_key xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">false</_key>
<_keyIdentifier xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">SurrogateKey</_keyIdentifier>
<ChecklistComplete>false</ChecklistComplete>
<Date>2013-03-05T15:43:49.5008406+02:00</Date>
<GpsAccuracy>1</GpsAccuracy>
<GpsLatitude>1</GpsLatitude>
<GpsLongitude>1</GpsLongitude>
<OrderComplete>false</OrderComplete>
<PhotoComplete>false</PhotoComplete>
<StockComplete>false</StockComplete>
<Sync>2013-03-05T15:43:49.5468406+02:00</Sync>
<checkListAnswers xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_list>
<d2p1:IdentityDataReferenceOfCheckListAnswerDataContractExX8I0_S_SPU>
<d2p1:_dataContract z:Id="i2">
<d2p1:_isDirty>true</d2p1:_isDirty>
<d2p1:_id xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d6p1:internalValue>95ae919b-a389-4ea7-a009-af1b91890c36</d6p1:internalValue>
</d2p1:_id>
<d2p1:_key>false</d2p1:_key>
<d2p1:_keyIdentifier>SurrogateKey</d2p1:_keyIdentifier>
<Answer>false</Answer>
<checkListQuestion>
<d2p1:_dataContract i:nil="true" />
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>false</d2p1:_hasDataContract>
<d2p1:_id xmlns:d7p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d7p1:internalValue>176cbb31-7df2-4966-baa9-4e3cd2a0c6d5</d7p1:internalValue>
</d2p1:_id>
</checkListQuestion>
</d2p1:_dataContract>
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>true</d2p1:_hasDataContract>
<d2p1:_id xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d5p1:internalValue>95ae919b-a389-4ea7-a009-af1b91890c36</d5p1:internalValue>
</d2p1:_id>
</d2p1:IdentityDataReferenceOfCheckListAnswerDataContractExX8I0_S_SPU>
</d2p1:_list>
</checkListAnswers>
<comments xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_list />
</comments>
<directSalesAgent xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_dataContract i:nil="true" />
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>false</d2p1:_hasDataContract>
<d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d3p1:internalValue>6f99f86a-5b1b-4f73-bdc3-388e0b7cf417</d3p1:internalValue>
</d2p1:_id>
</directSalesAgent>
<directSalesAgentSuperVisor xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_dataContract i:nil="true" />
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>false</d2p1:_hasDataContract>
<d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d3p1:internalValue>d57db20d-9b3a-4345-849e-d5a0d0d88f70</d3p1:internalValue>
</d2p1:_id>
</directSalesAgentSuperVisor>
<photos xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_list>
<d2p1:IdentityDataReferenceOfPhotoDataContractExX8I0_S_SPU>
<d2p1:_dataContract z:Id="i3">
<d2p1:_isDirty>true</d2p1:_isDirty>
<d2p1:_id xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d6p1:internalValue>3db431e9-3338-4c96-aea9-d833eb0dc8ae</d6p1:internalValue>
</d2p1:_id>
<d2p1:_key>false</d2p1:_key>
<d2p1:_keyIdentifier>SurrogateKey</d2p1:_keyIdentifier>
<Content i:nil="true" />
<Taken>2013-03-05T15:43:49.4748406+02:00</Taken>
</d2p1:_dataContract>
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>true</d2p1:_hasDataContract>
<d2p1:_id xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d5p1:internalValue>3db431e9-3338-4c96-aea9-d833eb0dc8ae</d5p1:internalValue>
</d2p1:_id>
</d2p1:IdentityDataReferenceOfPhotoDataContractExX8I0_S_SPU>
</d2p1:_list>
</photos>
<salesPoint xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_dataContract i:nil="true" />
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>false</d2p1:_hasDataContract>
<d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d3p1:internalValue>692a294a-2d1b-4026-9693-0c0ce552a2fb</d3p1:internalValue>
</d2p1:_id>
</salesPoint>
<stockCounts xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts" i:nil="true" />
</VisitDataContractEx>
Salida mono:
<VisitDataContractEx xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts">
<_isDirty xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">true</_isDirty>
<_id xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.Domain" xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:internalValue>9297eea9-82af-4981-ab9d-40aa0ac0fa0d</d2p1:internalValue>
</_id>
<_key xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">false</_key>
<_keyIdentifier xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">SurrogateKey</_keyIdentifier>
<ChecklistComplete>false</ChecklistComplete>
<Date>2013-03-05T17:49:06.362243+02:00</Date>
<GpsAccuracy>1</GpsAccuracy>
<GpsLatitude>1</GpsLatitude>
<GpsLongitude>1</GpsLongitude>
<OrderComplete>false</OrderComplete>
<PhotoComplete>false</PhotoComplete>
<StockComplete>false</StockComplete>
<Sync>2013-03-05T17:49:06.438934+02:00</Sync>
<checkListAnswers xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_list>
<d2p1:IdentityDataReferenceOfCheckListAnswerDataContractEx>
<d2p1:_dataContract xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" z:Id="i2">
<d2p1:_isDirty>true</d2p1:_isDirty>
<d2p1:_id xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d6p1:internalValue>75083457-9714-4971-b60c-f28fa43167ad</d6p1:internalValue>
</d2p1:_id>
<d2p1:_key>false</d2p1:_key>
<d2p1:_keyIdentifier>SurrogateKey</d2p1:_keyIdentifier>
<Answer>false</Answer>
<checkListQuestion xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d6p1:_dataContract xmlns:d7p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" i:nil="true" />
<d6p1:_description i:nil="true" />
<d6p1:_hasDataContract>false</d6p1:_hasDataContract>
<d6p1:_id xmlns:d7p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d7p1:internalValue>176cbb31-7df2-4966-baa9-4e3cd2a0c6d5</d7p1:internalValue>
</d6p1:_id>
</checkListQuestion>
</d2p1:_dataContract>
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>true</d2p1:_hasDataContract>
<d2p1:_id xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d5p1:internalValue>75083457-9714-4971-b60c-f28fa43167ad</d5p1:internalValue>
</d2p1:_id>
</d2p1:IdentityDataReferenceOfCheckListAnswerDataContractEx>
</d2p1:_list>
</checkListAnswers>
<comments xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_list />
</comments>
<directSalesAgent xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_dataContract xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" i:nil="true" />
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>false</d2p1:_hasDataContract>
<d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d3p1:internalValue>6f99f86a-5b1b-4f73-bdc3-388e0b7cf417</d3p1:internalValue>
</d2p1:_id>
</directSalesAgent>
<directSalesAgentSuperVisor xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_dataContract xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" i:nil="true" />
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>false</d2p1:_hasDataContract>
<d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d3p1:internalValue>d57db20d-9b3a-4345-849e-d5a0d0d88f70</d3p1:internalValue>
</d2p1:_id>
</directSalesAgentSuperVisor>
<photos xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_list>
<d2p1:IdentityDataReferenceOfPhotoDataContractEx>
<d2p1:_dataContract xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" z:Id="i3">
<d2p1:_isDirty>true</d2p1:_isDirty>
<d2p1:_id xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d6p1:internalValue>507f45d1-ce3a-4ec2-a343-d0b83cfb7bc8</d6p1:internalValue>
</d2p1:_id>
<d2p1:_key>false</d2p1:_key>
<d2p1:_keyIdentifier>SurrogateKey</d2p1:_keyIdentifier>
<Content i:nil="true" />
<Taken>2013-03-05T17:49:06.294006+02:00</Taken>
</d2p1:_dataContract>
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>true</d2p1:_hasDataContract>
<d2p1:_id xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d5p1:internalValue>507f45d1-ce3a-4ec2-a343-d0b83cfb7bc8</d5p1:internalValue>
</d2p1:_id>
</d2p1:IdentityDataReferenceOfPhotoDataContractEx>
</d2p1:_list>
</photos>
<salesPoint xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts">
<d2p1:_dataContract xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" i:nil="true" />
<d2p1:_description i:nil="true" />
<d2p1:_hasDataContract>false</d2p1:_hasDataContract>
<d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain">
<d3p1:internalValue>692a294a-2d1b-4026-9693-0c0ce552a2fb</d3p1:internalValue>
</d2p1:_id>
</salesPoint>
<stockCounts xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts" i:nil="true" />
</VisitDataContractEx>
Al ajustar el XML con Fiddler y probar las presentaciones, he reducido el problema a los nombres de los elementos en _list
elementos:
.RED:
<d2p1:_list>
<d2p1:IdentityDataReferenceOfCheckListAnswerDataContractExX8I0_S_SPU>
Mono:
<d2p1:_list>
<d2p1:IdentityDataReferenceOfCheckListAnswerDataContractEx>
Este es mi código que serializa los datos:
public string Serialize<TDataContract>(object obj)
{
var builder = new StringBuilder();
var serializer = new DataContractSerializer(typeof(TDataContract));
var xmlWriter = XmlWriter.Create(builder);
serializer.WriteObject(xmlWriter, obj);
xmlWriter.Close();
return builder.ToString().Replace("<?xml version=/"1.0/" encoding=/"utf-16/"?>", string.Empty);
}
¿Se trata de un error que debe ser abordado por el equipo de Mono, o alguien puede sugerir una posible solución?
Editar:
He estado reduciendo este problema aún más y no se trata de listas, se trata de la forma en que cada implementación elige nombres de elementos XML.
IdentityDataReference
toma un tipo genérico, y en este caso es de tipo CheckListAnswerDataContractEx
.
Sucede que IdentityDataReference
también se encuentra en una DLL distribuida (para la cual tengo el código fuente), por lo que sospecho que DataContractSerializer está utilizando la reflexión para elaborar el nombre automáticamente, y tal vez como una DLL distribuida por separado, .NET está agregando X8I0_S_SPU
en Al final, sin embargo, Mono no lo es.
También descubrí que puedo agregar un parámetro de nombre a DataContractAttribute de la siguiente manera: [DataContract(Name = "IdentityDataReference")]
que anulará el nombre generado para que sea simplemente IdentityDataReference
, ni siquiera intenta agregar el tipo Of cuando se especifica .
Desafortunadamente, una prueba rápida muestra que Mono está sufriendo una excepción de tiempo de ejecución cuando especifico el nombre e intenta deserializar los datos.
Ahora que entiendo mejor el problema, estoy tratando de hacer un proyecto aislado que replica el problema.
Editar - Marcando como resuelto:
Pasé de este proyecto hace muchos años, pero decidí cerrar esto como contestó Katulus, ya que hoy sentiría lo mismo con el mismo problema. Era nuestra esperanza en el momento en que pudiéramos obtener una integración entre plataformas sin dolor "gratuita" sin trabajo adicional a un servicio existente de WCF, que resultó ser ingenuo.
Hoy, si se presentara el mismo requisito, elegiría un protocolo de comunicación más compatible con varias plataformas. Si no pudiera reemplazar la infraestructura existente de WCF, crearía algún tipo de facade y / o adapter (posiblemente en una solución diferente) que exponga el servicio sobre algo como WebAPI utilizando la serialización JSON, hablando con el servicio WCF original en el fondo.
Si se está comunicando entre diferentes plataformas (aunque .NET y Mono intenten ser lo mismo), debe evitar usar DataContractSerializer. Hay otros posibles problemas además de este error. Si, por ejemplo, cambia las clases en el servidor, todos los clientes pueden dejar de funcionar y viceversa. En el escenario servidor-cliente donde no tienes control total de ambos lados, esto puede ser un gran problema.
Cambiaría DataContractSerializer a XmlSerializer que puede controlar mejor en ambos lados. O incluso implementar su propia serialización desde y hacia XML, donde puede contabilizar futuras actualizaciones. Si agrega alguna propiedad nueva en un servidor, puede actualizar su deserializador de una manera que pueda manejar si esa nueva propiedad falta de algún cliente antiguo.