繁体   English   中英

C#,将Xml序列化与Nhibernate混合时出现问题

[英]C#, problem mixing Xml Serialization with Nhibernate

我正在使用Nhibernate来持久化对象,并使用Xml序列化来导入和导出数据的程序。 我不能对集合使用相同的属性,例如,Nhibernate需要将它们用作Ilist,因为它具有该接口的自己实现,而我无法序列化接口。 但是由于我需要同步两个属性,所以我认为我可以对同一个字段使用两个不同的属性。 这些属性将根据我对每个框架的需求而定,并且它们将不断更新Field。

因此,我有以下领域:

private IList<Modulo> modulos;

以及以下属性:

 [XmlIgnore]
        public virtual IList<Modulo> Modulos
        {
            get { return modulos; }
            set { modulos = value; }
        }

        [XmlArray]
        [XmlArrayItem(typeof(Modulo))]
        public virtual ArrayList XmlModulos
        {
            get
            {
                if (modulos == null) return new ArrayList();
                var aux = new ArrayList();
                foreach (Modulo m in modulos)
                    aux.Add(m);
                return aux;
            }
            set
            {
                modulos = new List<Modulo>();
                foreach (object o in value)
                    modulos.Add((Modulo)o);
            }

        }

第一个很完美,很标准,但是第二个却有些问题。 该get很好用,因为我没有任何问题可以序列化对象(这意味着它可以正确地从字段中获取信息)。 但是,当我需要反序列化时,并不能获取所有信息。 调试器说,反序列化之后,该字段不会更新(空),并且属性为空(计数= 0)。

显而易见的解决方案是使用两个不相关的属性,每个框架一个,然后在需要时手动传递信息。 但是类的结构很复杂,我认为应该有一个更简单的方法来做到这一点。

知道如何修改其属性以执行我想要的工作吗? 任何帮助将不胜感激。

简短的答案是你不能。

通常,您将创建一个与NHibernate对象分开的DTO(数据传输对象)。 例如:

    public class PersonDto
    {
      [XmlAttribute(AttributeName = "person-id")]
      public int Id { get; set; }

      [XmlAttribute(AttributeName = "person-name")]
      public string Name{ get; set; }
    }

在DTO对象上,仅放置要序列化的属性。 然后,当您需要序列化DTO时,您将根据自己的域模型创建DTO。

有一个很棒的小库叫做automapper,它使您从域对象到dto的映射非常简单。 请参阅: http//automapper.codeplex.com/

这是一个支持映射到上述DTO的人员类的示例。

public class Person
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }

    static Person()
    {
        Mapper.CreateMap<PersonDto, Person>();
        Mapper.CreateMap<Person, PersonDto>();
    }

    public Person(PersonDto dto)
    {
        Mapper.Map<PersonDto, Person>(dto, this);
    }

    public PersonDto ToPersonDto()
    {
        var dto = new PersonDto();
        Mapper.Map<Person, PersonDto>(this, dto);
        return dto;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM