NHibernate: Как мне XmlSerialize ISet <T>? - PullRequest
5 голосов
/ 24 декабря 2009

Дано:

Проблема:

  • Я не могу XmlSerialize ISet свойства.

Я получаю следующие ошибки:

Невозможно сериализовать член [пространство имен]. [сущность]. [свойство] из тип Iesi.Collections.Generic.ISet`1 [[имена]. [Объект], [сборка], версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = ноль]] потому что это интерфейс.

  • Я свободно признаю: я очень новичок в NHibernate.
    • Так что я не знаю, какие у меня есть варианты.
  • Я считаю , что мне нужно использовать набор, а не сумку, потому что мои коллекции содержат уникальные предметы.
  • Когда я преобразовал свойства ISet в свойства HashedTable (т. Е. Конкретный класс), я получил следующие ошибки:

Вы должны реализовать средство доступа по умолчанию на Iesi.Collections.Generic.HashedSet`1 [[имена]. [Объект], [Сборка], Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null]] потому что это наследуется от ICollection.

Мои вопросы:

  • Что я должен сделать, чтобы исправить эту ситуацию?
    • Должен ли я реализовать средства доступа по умолчанию во всех моих классах сущностей?
      • Если так, есть ли рекомендуемый шаблон для этого?

В качестве sidenote, я пытался поискать в Google.
- Я не думаю, что это новая проблема.

Ответы [ 4 ]

1 голос
/ 28 декабря 2009

Вы никогда не сможете XML-сериализовать интерфейс - только конкретный класс, который реализует интерфейс.

1 голос
/ 28 декабря 2009

Попробуйте вместо этого использовать DataContractSerializer . Это более ограничительно, но будет сериализовать больше.

Дэн Ригсби объясняет разницу между XMLSerializer и DataContractSerializer

Вот пример из одного из моих сообщений о 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;
    }
0 голосов
/ 18 февраля 2013

1) Загрузка картографа бобов Dozer из файла сопоставления

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

2) Преобразуйте каждый объект в обычный объект, удалив сведения, связанные с постоянными пакетами

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