【问题标题】:C#, problem mixing Xml Serialization with NhibernateC#,将 Xml 序列化与 Nhibernate 混合的问题
【发布时间】:2010-08-22 06:30:56
【问题描述】:

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

所以,我有以下字段:

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),Property为空(Count = 0)。

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

任何想法我可以修改我的财产以做我想做的事吗?任何帮助将不胜感激。

【问题讨论】:

  • 您是否延迟加载集合?如果是这样,反序列化 XML 将不会加载它,因此计数为 0。最简单但冗长的方法是专门为 Web 创建一个包装类,而不是传递 NHibernate 对象,这只是一个坏主意。

标签: c# nhibernate xml-serialization


【解决方案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 的 person 类的示例。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多