我正在开发一个使用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)。
显而易见的解决方案是使用两个不相关的属性,每个框架一个,并在需要时手动传递信息。但是类结构非常复杂,我认为应该有一种更简单的方法来实现这一点。
任何想法我如何修改我的财产,让它做我想做的事情?任何帮助将不胜感激。
答案 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;
}
}