【问题标题】:NHibernate: How do I XmlSerialize an ISet<T>?NHibernate:我如何 XmlSerialize 一个 ISet<T>?
【发布时间】:2009-12-24 15:21:28
【问题描述】:

给定:

问题:

  • 我无法 XmlSerialize ISet 属性。

我收到如下错误:

无法序列化成员 [命名空间].[实体].[属性] 类型 Iesi.Collections.Generic.ISet`1[[namespace].[entity], [程序集],版本=1.0.0.0, 文化=中立,PublicKeyToken=null]] 因为它是一个接口。

  • 我坦率地承认:我对 NHibernate 很陌生。
    • 所以我不知道我的选择是什么。
  • 相信我需要使用套装而不是包,因为我的收藏品包含独特的物品。
  • 当我将 ISet 属性转换为 HashedTable 属性(即具体类)时,出现如下错误:

您必须实现默认访问器 上 Iesi.Collections.Generic.HashedSet`1[[namespace].[entity], [部件], 版本=1.0.0.0,文化=中性, PublicKeyToken=null]] 因为它 继承自 ICollection。

我的问题:

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

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

【问题讨论】:

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


    【解决方案1】:
    【解决方案2】:

    尝试改用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】:

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

      【讨论】:

      • 我以前不得不处理这个问题。在 XML Serializable 类中,必须将 List 成员公开为 List 属性,而不是 IList 或 IEnumerable。否则,接口属性必须在非接口版本中复制。我认为,前一种选择是两害相权取其轻。
      • @Grant:你不能用 NHibernate 做到这一点。 NH 需要集合接口。
      • @Mauricio:好的,非常好。我只知道一点关于 NH 的信息,而我并不知道。嗯,看起来情况很艰难。
      【解决方案4】:

      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)); 
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 2010-12-28
        • 1970-01-01
        相关资源
        最近更新 更多