Monday, January 8, 2007

How to create .NET Components / Assemblies with serialization requirements

Me topé con la necesidad de crear un componente que me ayudara a manipular un mensaje XML extraido desde SAP. Este componente recibiría de parametro el XML en string en una propiedad de mi componente y retornaría el un string del XML modificado.

Lo que he entendido hasta ahorita es que TODOS los componentes que uno programe para ser usados dentro de Biztalk deberán tener el atributo Serializable (esto es en VB.NET) al definir la clase:

<Serializable> _
Public Class MyClass


¿Pero que pasa si este componente está dentro de una orquestación transaccional?. Cuando Biztalk ejecuto la orquestación, verificará y enumerará los componentes dentro de ella. Si tu componente no tiene lo necesario para ser Serializado, tendrás un error en tiempo de ejecución, ya que Biztalk le solicitará a tu componente que se Serialize a si mismo cuando llegue el momento.

Para tratar con este requerimiento, encontré varias respuestas en internet:

1. Remueve todo lo que tenga que ver con serialización dentro de tu componente. El componente deberá ser invocado dentro de un Expresion Shape el cual deberá estar dentro de un Atomic Transacction, con esto evitarás que el Biztalk le solicite a tu componente que se serialize. Esta solución es mas útil cuando tienes que invocar componentes de negocio que ya fueron construídos por alguien mas.

2. Puedes implementar lo necesario para que tu componente simule la serialización. Esto no es un truco, sino realmente es como debería de hacerse con cada componente que diseñes para ser usado dentro de tu orquestación. Los pasos a seguir son: Utilizar el atributo Serializable en tu clase, implementar la interfaz ISerializable e implementar un constructor y una función especiales que Biztalk mandará a invocar.
Este es un ejemplo (en VB.NET)

Imports System.Runtime.Serialization
<Serializable> _
Public Class MyClass Implements ISerializable

'Constructors
Public Sub New()

End Sub

'Serialization Constructor
Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
End Sub

'Serialization Function
Public Overridable Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext) Implements ISerializable.GetObjectData
End Sub
End Class


El constructor adicional con los dos parámetros será invocado por Biztalk al principio de la orquestacion como modo de verificación. La clase GetObjectData será invocada cuando se necesite des-serializar el objeto. Dentro de est

Para mas información acerca de este tema:

Serialization
Atomic Scope Abuse


No comments: