2012-02-10 18 views
5

Necesito serializar un objeto usando BinaryFormatter con .NET 4.0 y enviarlo a través del cable (a través de SOAP como una matriz de bytes) a un servicio web que se ejecuta bajo .NET 3.5. Y viceversa. He probado este escenario y parece funcionar bien.¿Pueden los objetos serializarse/deserializarse en diferentes versiones de marco?

Hay un viejo question con respecto a este escenario en SO, que habla de .NET 1.xa 2.0, que no me dejó con mucha confianza sobre el enfoque.

Así que funciona en mi arnés de prueba, pero no puedo probar todas las variaciones posibles del objeto, por lo que necesito algunos fundamentos teóricos.

Como regla, ¿pueden los objetos serializarse/deserializarse en diferentes versiones de marco? ¿Es esto un escenario aceptado o un truco que funcionó en mi caso?

+0

¿Qué tipo de serialización está utilizando (Binario, XML, JSON, etc.)? –

+0

Creo que tienes que dejar de ser "AngryHacker" y convertirte en "JollyHacker" para que esto funcione mejor :) –

+0

@JustinNiessner Binary. – AngryHacker

Respuesta

1

Si por "binario" te refieres a BinaryFormatter, entonces ya es tremendamente intolerante entre las versiones, ya que está estrictamente ligada a los metadatos de tipo (a menos que trabajes muy duro con enlaces personalizados). Como tal, solo es estrictamente confiable cuando ambos extremos están usando exactamente las mismas implementaciones. Incluso cambiar una propiedad hacia/desde una propiedad implementada automáticamente es un cambio radical.

Esto no es un error de "binario", sino una característica de BinaryFormatter. Otros serializadores binarios no tienen este problema. Por ejemplo, protobuf-net funciona entre sistema operativo, entre marcos, etc., ya que el formato a: no se preocupa de sus tipos específicos, y b: se fija a una especificación publicada.

Si está utilizando BinaryFormatter para esto actualmente: entonces IMO sí, debe probar explícitamente cada API. Desde , cualquier tipo de podría cambiar un detalle de implementación. Y desafortunadamente, dado que BF tiene la costumbre de extraer datos inesperados (a través de eventos, etc.), incluso esto no es necesariamente suficiente para validar el uso real.

+0

Los objetos que estoy ejecutando a través del cable están aislados en un ensamblaje separado (compilado en .NET 3.5). Tanto el cliente como el servidor tienen la copia exacta del ensamblaje, por lo que las cosas como los cambios de propiedad no son una preocupación. Además, los objetos son objetos puros de transferencia de datos, p. no hay eventos ni nada de eso. ¿Estoy a salvo en ese escenario? – AngryHacker

+1

@AngryHacker Saludo a su buena planificación y pensamiento progresivo. Eso te aislará de un mundo de dolor aquí. Con esa configuración, esperaría * que funcione. Me sorprendería si eso fallara, pero ocasionalmente suceden sorpresas. –

1

Si el formato de serialización es XML (SOAP) o JSON, no debería ser ningún problema. No estoy seguro de cómo reaccionaría un objeto serializado binario.

1

El mayor problema con la serialización es cuando tienes primitivas que no existen. Demonios, el problema existe al ir a ciertos tipos en el código nativo, por lo que no es un problema único que se encuentra en los servicios (suposición).

Como una "regla", puede serializar en versiones de framework e incluso en clientes escritos en Java, Delphi y COBOL (siempre que tenga una versión con servicio web y siempre que haya expuesto adecuadamente los objetos serializados a través de un punto final de servicio) .

Estoy tratando de pensar si hay primitivos en .NET que no estaban presentes en 1.x, ya que serían problemáticos. Al igual que cualquier objeto de marco nuevo que intente serializar. Usted tiene mucho menos peligro con 2.0 (quizás inexistente)

Cuanto más "abierta" sea su serialización (es decir, estándares como JSON, SOAP, etc., simplificados: JSON o XML, al menos en la mayoría de los casos) , es menos probable que tengas problemas. Y, si tiene problemas, puede codificar alrededor de los poderes automáticos, etc. A medida que avanza hacia el binario, puede haber cierta incompatibilidad entre un objeto serializado en 4.0 con WCF y un cliente Remoting.

+0

serializo con el serializador binario y lo transmito a través de SOAP. ¿Puedes dar un ejemplo (incluso uno teórico) donde habría una incompatibilidad? – AngryHacker

+0

No está a la mano. Si está serializando sus objetos de dominio (y no cosas de .NET Framework) y se adhiere a las primitivas que existían desde 1.x (por ejemplo, alejarse de los tipos anulables), no creo que tenga un problema, incluso con serialización binaria. Básicamente, si está pasando state (objetos básicos con getters y setters en propiedades y no mucho más) y apegándose a primitivos comunes, debería estar bien. –

+0

Y, desde el punto de vista arquitectónico, puede volver a un punto final basado en SOAP para sus clientes 1.x si ha salido del modo "simple". :-) ::: Tengo que amar la flexibilidad en WCF. –

Cuestiones relacionadas