5
votes

Given:

Problem:

  • I'm can't XmlSerialize ISet properties.

I get errors like the following:

Cannot serialize member [namespace].[entity].[property] of type Iesi.Collections.Generic.ISet`1[[namespace].[entity], [assembly], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it is an interface.

  • I'll freely admit: I'm very new to NHibernate.
    • So I don't know what my options are.
  • I believe that I need to use a set as opposed to a bag because my collections contain unique items.
  • When I converted the ISet properties to HashedTable properties (i.e. a concrete class), I got errors like the following:

You must implement a default accessor on Iesi.Collections.Generic.HashedSet`1[[namespace].[entity], [assembly], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it inherits from ICollection.

My questions:

  • What should I do to remedy this situation?
    • Should I implement default accessors in all of my entity classes?
      • If so, is there a recommended pattern for doing so?

As a sidenote, I tried Googling for help.
- I don't think this is a new problem.

4

4 Answers

1
votes

Try using the DataContractSerializer instead. It's more restrictive, but will serialize more.

Dan Rigsby explains the difference between XMLSerializer and DataContractSerializer

Here's an example from one of my posts on stackoverflow:

public XDocument GetProductXML(Product product)
    {
        var serializer = new DataContractSerializer(typeof(Product));
        var document = new XDocument();

        using (var writer = document.CreateWriter())
        {
            serializer.WriteObject(writer, product);
            writer.Close();
        }

        return document;
    }
1
votes

You can never XML Serialize an interface - only a concrete class that implements the interface.

0
votes

1) Load the Dozer bean mapper from mapping file

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

2) Covert each object to a normal object removing persistentbag related details

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