Daniel, si si, lo que decis es totalmente cierto, salvo que en el otro extremo tengo una aplicacion realizada en FLEX (Action Script 3) y enviamos los datos como texto en XML. Ademas por el volumen de la info en varios casos, serilizamos obteniendo el XML y lo comprimimos con Zlib y enviamos, y alla hacemos la inversa, que si bien invertimos mas en procesamiento lo ganamos en velocidad de respuesta al usuario. El tema en cuastion es asi, Yo tengo una clase que tiene que tener dos comportamientos distintos segun este siendo creada desde un New en mi codigo de .Net, o cuando se crea automaticamebnte con el metodo deserializar de XMLSerializer. Lo que se me ocurrio es poner una propiedad/bandera que se serialize y que esta sea la primera propiedad a serializar con un valor TRUE, luego cuando deserializo el objeto viene esa propiedad y se carga en true Class ItemColeccion Private mEsSerializacion as Boolean = False Private mValor as Double Private mEstado as eEstado = eEstado.SinCambio ' (1-SinCambio 2-Modificado 3-Agregado 4-Eliminado) Public Property EsSerializacion() as Boolean Get return mEsSerializacion End Get Set (vaue as Boolean) mEsSerializacion = value End Get End Property Public Property Estado() as eEstado Get return mEstado End Get Set (vaue as eEstado) mEstado = value End Get End Property Public Property Valor() as Double Get return mValor End Get Set (vaue as Double) If mValor <> value then mValor = value mEstado = eEstado.Modificado End If End Get End Property '...... Asi con cada propiedad End Class Creo una instancia en .NET Dim oItem as ItemColeccion oItem.Valor = 23 --> Aqui la clase ya me refleja que una de sus propiedades cambio de valor, y luego mi mapeador va a actuar segun el estado. TODO BIEN Cuando el objeto vuelve en un WS, llega como texto y lo mando a una funcion que lo deserializa <WebMethod(enablesession:=True)> _ Public Function Grabar(ByVal pObjeto As Object) As ResultObject Try Dim oEntity As Object = Activator.CreateInstance(GetType(ItemColeccion)) Dim cData As String = UpSoft.ManagerNet.App.Helpers.UnCompress(pObjeto)
oEntity = UpSoft.ManagerNet.App.Helpers.DeSerializeObject(cData, oEntity) ''--> ESTA ES LA FUNCION QUE DESERIALIZA 'hacer lo que se necesite Return ReturnDataOK(oEntity.ID) Catch ex As Exception Return ReturnError(ex.Message, ex) End Try End Function 'Cuando se deserializa, internemente se crea el objeto y se va llenado una a unas las propiedades, por lo tanto al ingresar en VALOR, detecta que cambio y marca el estado como Modificado, cuando puede suceder y de echo lo hace que si en un primer WS hago un FETCH y devuelvo el objeto con estado SinCambio... en el otro sistema no lo toco... y llamo a WS GRABAR, viene nuevamente el objeto con los mismo valores y entonces le pone Modificado. Lo que deberia hacer yo es que si el objeto esta siendo creado desde una Deserializacion, controlarlo algo asi If mValor <> value AND EstoySiendoCreadoDesdeSerialziacion then mValor = Value mEstado = eEstado.Modificado End If Sino no lo tendria que hacer Con la bandera EsSerializacion, lo logro a medias, funciona, pero la bandera me queda marcada en el objeto y si luego modifico una propiedad manualmente en .net, como la bandera esta marcada no actualiza el estado Por lo tanto, las dos alternativas que se me ocurrieron (pero que no me da la cabeza, o no encuetro como detectar es lo sig) 1- Que el metodo Deserializar posea un Handle que indique que finalizo (con esto pondria la bandera en False) 2- Detectar que se esta llenado el objeto desde el metodo Deserializar 2.1 Esto lo hice de una manera que no me agrada y creo que poco performante. Tengo elmetodo EstoySiendoCreadoDesdeSerialziacion() que pide el CallStack y busca como texto el nombre de la funcion Deserialziar en la sllamadas previas _____ De: puntonet@mug.org.ar [mailto:[EMAIL PROTECTED] En nombre de Daniel Calvin Enviado el: Miércoles, 25 de Julio de 2007 18:42 Para: puntonet@mug.org.ar Asunto: [puntonet] XMLSerialization, detectar la finalizacion Hola Diego Para que serializas vos si usas ws?, el framework se encarga de todo, no necesitas serializar y des serializar. Lo`único que debes hacer es generar el proxy desde linea de comando y reformarlo para que no cree un dto de tu clase, solo referencia tu clase existente. Con eso tenes todo resuelto. Daniel Calvin El día 25/07/07, Diego Baselica <[EMAIL PROTECTED]> escribió: Hola grupo Estoy utilizando XMLSerialization para enviar objetos a traves de WS Resulta que se me presenta la siguiente situacion y no puedo resolverla Lo planteo con un ejemplo mas simple. Mi clase tiene 2 propiedades y otra mas que es un calculo de las 2 primeras <Serializable()> _ Class Rectangulo Public mAncho as Double Public mAlto as Double <XmlInclude(False)> _ Public mSuperficie as Double Private Sub Calcular() mSuperficie = mAlto * mAncho End Sub End Class ** En este ejemplo, es obvio que se podria resolver teniendo un metodo que sea CalcularSuperficie y realice el calculo cada ves que lo solicitamos, pero es solo a modo de simplificar la situacion ** Lo que necesito es que cuando se termine de deserializar, poder informar a la clase que esta lista, para que invoque el metodo Calcular, cuando ya estoy seguro que todas las propiedades estan deserializadas. Encontre lo que deseo, pero solo funciona con BinaryFormatters y no con XMLSerialization, y es una interface IDeserializationCallBack que pose un metodo OnDeserialzation() Con lo que se podria hacer Public Sub OnDeserialzation() Calcular End Sub Pero luego de una busqueda muuuuy larga en google encontre que solo funciona con los BinaryFormatter, y es algo que no lo podemos cambiar Sabe alguien de alguna solucion de notificacion cuando finalice la serializacion Muchas Gracias UpSoft Sistemas Informáticos Rafael Nuñez 3498 Tel/Fax: +54 (0351) 4814812 rot. [EMAIL PROTECTED] -- Daniel A. Calvin Cooperator Team Member http://www.cooperator.com.ar Microsoft Certified Professional