NHibernate: ¿Cómo puedo XmlSerializar un ISet ?

Dado:

  • Estoy tratando de crear una API REST usando ASP.NET MVC .
  • Estoy usando NHibernate en mi capa de acceso a datos.

Problema:

  • No puedo XmlSerializar las propiedades de ISet.

Recibo errores como los siguientes:

No se puede serializar miembro [espacio de nombres]. [Entidad]. [Propiedad] de tipo Iesi.Collections.Generic.ISet`1 [[namespace]. [Entity], [assembly], Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] porque es una interfaz.

  • Lo admitiré abiertamente: soy muy nuevo en NHibernate.
    • Entonces no sé cuáles son mis opciones.
  • Creo que necesito usar un conjunto en lugar de un bolso porque mis colecciones contienen artículos únicos.
  • Cuando convertí las propiedades de ISet a propiedades de HashedTable (es decir, una clase concreta), obtuve errores como los siguientes:

Debe implementar un descriptor de acceso predeterminado en Iesi.Collections.Generic.HashedSet`1 [[namespace]. [Entity], [assembly], Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] porque hereda de ICollection.

Mis preguntas:

  • ¿Qué debería hacer para remediar esta situación?
    • ¿Debo implementar accesos predeterminados en todas mis clases de entidad?
      • Si es así, ¿hay un patrón recomendado para hacerlo?

Como nota al margen, traté de buscar ayuda en Google.
– No creo que este sea un problema nuevo.

La serialización NHibernate ha sido tratada mucho en stackoverflow . Ver:

  • C # Castle ActiveRecord: ¿Cómo elegantemente (XML) serializar objetos ActiveRecord?
  • ¿Cómo serializo todas las propiedades de un objeto NHibernate-mapeado?
  • Serialización NHibernate y WCF (Unidireccional)
  • JSON.NET y nHibernate Carga diferida de colecciones
  • ¿Qué serializadores .NET JSON pueden tratar con objetos proxy de NHibernate?
  • DTO vs Serialización de entidades persistentes
  • Regresar las clases de mapeo de NHibernate desde los servicios de WCF

En pocas palabras: use DTOs.

Nunca puede XML serializar una interfaz, solo una clase concreta que implementa la interfaz.

1) Cargue el mapeador de beans Dozer del archivo de mapeo

 DozerBeanMapper dtoMapper = new DozerBeanMapper(Arrays.asList(new String[]{dozerMappingfile})); 

2) Oculta cada objeto a un objeto normal eliminando detalles relacionados con persistentbag

 List lstProfilehib = //hibernate loaded objects List lstProfile = new ArrayList(); for(MyEjb sp: lstProfilehib){ lstProfile.add( dtoMapper.map(sp, MyEjb.class)); }