C#,问题混合Xml序列化与Nhibernate

时间:2010-08-22 06:30:57

标签: c# nhibernate xml-serialization

我正在开发一个使用Nhibernate来持久化对象的程序,以及用于导入和导出数据的Xml Serialization。我不能对集合使用相同的属性,例如,Nhibernate需要它们是Ilists,因为它有自己的接口实现,我不能序列化接口。但是因为我需要同步两个属性,我想我可以为同一个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是工作得很好,因为我没有问题序列化对象(意味着它正确地从字段中获取信息)。但是当我需要反序列化时,它并没有获得所有信息。调试器表示在反序列化后,字段未更新(null)且属性为空(Count = 0)。

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

任何想法我如何修改我的财产,让它做我想做的事情?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

简短的回答是你不能。

通常,您将创建与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;
    }
}