代码之家  ›  专栏  ›  技术社区  ›  Jim G.

nhibernate:如何XML序列化ISET?

  •  5
  • Jim G.  · 技术社区  · 15 年前

    鉴于:

    问题:

    • 我无法XML序列化ISET属性。

    我得到如下错误:

    无法序列化成员 的[命名空间].[实体].[属性] 类型 iesi.collections.generic.iset`1[[命名空间].[实体], [程序集],版本=1.0.0.0, 区域性=中性,publicKeyToken=空]] 因为它是一个接口。

    • 我可以自由地承认:我对NHibernate很陌生。
      • 所以我不知道我的选择是什么。
    • 相信 我需要使用一套,而不是一个袋子,因为我的收藏包含独特的项目。
    • 当我将ISET属性转换为哈希表属性(即具体类)时,我得到如下错误:

    必须实现默认访问器 在 iesi.collections.generic.hashedset`1[[命名空间].[实体], [汇编], 版本=1.0.0.0,文化=中性, publicKeyToken=空]]因为它 从ICollection继承。

    我的问题:

    • 我该怎么做才能补救这种情况?
      • 我应该在所有实体类中实现默认访问器吗?
        • 如果有,是否有推荐的模式?

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

    4 回复  |  直到 12 年前
        2
  •  1
  •   Community paulsm4    7 年前

    尝试使用 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;
        }
    
        3
  •  1
  •   John Saunders    15 年前

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

        4
  •  0
  •   user1393631    12 年前

    1)从映射文件加载推土机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)); 
            }