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 

Responder a