none
DataContractSerializer - Serializando desde clase heradada a clase base RRS feed

  • Pregunta

  • Expongo las diferentes clases y su ubicación dentro del proyecto:

    En una library class tengo la clase User, DataContract, (Esta libreria se va a usar tanto en el cliente como en el servidor)

    using System;
    using System.ComponentModel;
    using System.Security.Principal;
    using ESP.Core.Settings;
    using ESP.Core.Kernel;
    using ESP.Data;
    using System.Runtime.Serialization;
    
    namespace ESP.Core.Security
    {
     
     /// <summary>
     /// Represent user ESP application
     /// </summary>
     [Serializable]
     [DataContract]
     public class User 
     {
      #region Variables Miembro
       private string s_name=null;
      #endregion
    
     
      #region Properties
    
      [DataMember]
      /// <summary>
      /// User name to logon
      /// </summary>
      public string Name
      {
       get
       {
        return s_name;
       }
       set
       {
        s_name=vale;
       }
      }
     }
    }

    Tambien tengo el ServiceContract

     

    using System;
    using System.Collections.Generic;
    using ESP.Core.Security;
    using ESP.Core.Kernel;
    using System.ServiceModel;
    using System.Text;
    
    namespace ESP.Contracts.Security
    {
      [ServiceContract]
      public interface IUser
      {
        #region Metodos
    
    
        [OperationContract]
        [TransactionFlow(TransactionFlowOption.Allowed)]
        /// <summary>
        /// Try logon on ESP System
        /// </summary>
        /// <param name="UserName">UserName</param>
        /// <param name="Password">Password</param>
        /// <returns></returns>
        User Logon(string UserName, string Password);
    
    
        #endregion
      }
    }
    
    

     

    En otra libreria tengo el ServiceBehavior, (esta solo necesita estar en el servidor )

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.ServiceModel;
    
    using ESP.Contracts.Security;
    using ESP.Adapters.Security;
    using ESP.Core.Security;
    using System.Runtime.Serialization;
    using System.IO;
    
    namespace ESP.Behaviors.Security
    {
      [ServiceBehavior]
      public class UserBehavior:IUser
      {
    
        #region Metodos
    
    
    
        [OperationBehavior(TransactionScopeRequired = true)]
        /// <summary>
        /// Try logon on ESP System
        /// </summary>
        /// <param name="UserName">UserName</param>
        /// <param name="Password">Password</param>
        /// <returns></returns>
        User IUser.Logon(string UserName, string Password)
        {
          UserAdapter usr = new UserAdapter();
          usr.FillByUsuario(UserName,Password);      
          return usr;
    
        }
    
    
        #endregion
      }
    }
    
    
    

    Y tengo otra libreria  con una clase llamada UserAdapter que hereda  de User, y que la utilizo para acceder a la base de datos, esta libreria considero que no es necesario que este en el cliente.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data.Common;
    using ESP.Core.Security;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Data;
    namespace ESP.Adapters.Security
    {
      /// <summary>
      /// User DA (Data Access)
      /// </summary>
      [Serializable]
      [DataContract]
      public class UserAdapter:User
      {
        /// <summary>
        /// Carga usuario
        /// </summary>
        public void FillByUsuario(string user, string password)
        {
          //Enterprise library
          DataContext.Connection.Open();
    
          string s_pwdencrypted=EncryptPassword(password);
    
          
    
          DbCommand dbCommand = DataContext.Database.GetStoredProcCommand("dbo.GETUSER");
          dbCommand.Connection = DataContext.Connection;
    
          DbParameter p_user= dbCommand.CreateParameter();
          p_user.Direction = System.Data.ParameterDirection.Input;
          p_user.ParameterName = "@USER";
          p_user.Value=user;
    
    
          DbParameter p_pwd= dbCommand.CreateParameter();
          p_pwd.Direction = System.Data.ParameterDirection.Input;
          p_pwd.ParameterName = "@PASSWORD";
          p_pwd.Value = password;
    
    
          using (IDataReader dataReader = DataContext.Database.ExecuteReader(dbCommand))
          {
            if (dataReader.Read())
            {
              this.Name = dataReader.GetString(0);
              //..Other fields
            }
          }
          
          DataContext.Connection.Close();     
    
        }
    
        protected virtual string EncryptPassword(string password)
        {
          return password;
        }
    
    
      }
    }

    El error viene cuando desde el cliente es llamado el metodo Logon, ya que serializa el usuario a devolver como la clase UserAdapter yo quiero que serialize como clase User. Alguien sabe como hacerlo¿?

     

    Un saludo y muchas gracias.

     

    martes, 11 de mayo de 2010 6:34

Todas las respuestas

  • Solucionado, Indicando el mismo name-namespace de datacontract en ambas clases .-.

     

    [DataContract(Name = "User", Namespace = "http://schemas.esp.com/Security/User")]
    public class User
    {
    ..........
    }




    /// <summary>
    /// User DA (Data Access)
    /// </summary>
    [Serializable]
    [DataContract(Name = "User", Namespace = "http://schemas.esp.com/Security/User")]
    public class UserAdapter:User
    {
    }


    martes, 11 de mayo de 2010 8:31