views:

1002

answers:

3

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.

+1  A: 

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;
    }
mattRo55
+1  A: 

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

John Saunders
I've had to deal with this before. In an XML Serializable class, a List member had to be exposed as a List property, rather than IList or IEnumerable. Otherwise, the interface property would have to be duplicated in a non-interface version. The former choice is the lesser of two evils, I think.
Grant Palin
@Grant: you can't do that with NHibernate. NH needs collections interfaces.
Mauricio Scheffer
@Mauricio: OK, very good. I only know the tiniest bit about NH, and I did not know THAT. Hmm, looks like a tough situation then.
Grant Palin