NHibernate:我如何XmlSerialize一个ISet <t>?</t>

时间:2009-12-24 15:21:28

标签: asp.net-mvc nhibernate xml-serialization

假设:

问题:

  • 我不能使用XmlSerialize ISet属性。

我收到如下错误:

  

无法序列化成员   [namespace]。[entity]。[property] of   类型   Iesi.Collections.Generic.ISet`1 [命名空间]。[实体]   [assembly],版本= 1.0.0.0,   Culture = neutral,PublicKeyToken = null]]   因为它是一个界面。

  • 我会坦然承认:我对NHibernate很新。
    • 所以我不知道我的选择是什么。
  • 相信我需要使用一个集合而不是一个包,因为我的集合包含唯一的项目。
  • 当我将ISet属性转换为HashedTable属性(即具体类)时,出现如下错误:
  

您必须实现默认访问者   上   Iesi.Collections.Generic.HashedSet`1 [命名空间]。[实体]   [部件],   版本= 1.0.0.0,文化=中立,   PublicKeyToken = null]]因为它   继承自ICollection。

我的问题:

  • 我应该怎么做才能解决这个问题?
    • 我应该在所有实体类中实现默认访问器吗?
      • 如果是这样,是否有推荐的模式?

作为旁注,我试着谷歌寻求帮助 - 我认为这不是一个新问题。

4 个答案:

答案 0 :(得分:12)

答案 1 :(得分:1)

请尝试使用DataContractSerializer。它更具限制性,但会更多序列化。

Dan Rigsby explains the difference between XMLSerializer and 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;
    }

答案 2 :(得分:1)

您永远不能XML序列化接口 - 只是实现接口的具体类。

答案 3 :(得分:0)

1)从映射文件

加载Dozer bean映射器
DozerBeanMapper dtoMapper = new DozerBeanMapper(Arrays.asList(new String[]{dozerMappingfile}));

2)将每个对象转换为正常对象,删除persistentbag相关细节

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