[英]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.