C#,混合Xml序列化和Nhibernate的问题
我正在开发一个程序,该程序使用Nhibernate来持久化对象,并使用Xml序列化来导入和导出数据。我不能对集合使用相同的属性,例如,Nhibernate需要它们成为Ilists,因为它有自己的接口实现,并且我不能序列化接口。但是由于我需要同步两个属性,我想我可以对同一个字段使用两个不同的属性。属性将根据我对每个框架的需要而定,并且它们将相应地更新字段 因此,我有以下字段:C#,混合Xml序列化和Nhibernate的问题,c#,nhibernate,xml-serialization,C#,Nhibernate,Xml Serialization,我正在开发一个程序,该程序使用Nhibernate来持久化对象,并使用Xml序列化来导入和导出数据。我不能对集合使用相同的属性,例如,Nhibernate需要它们成为Ilists,因为它有自己的接口实现,并且我不能序列化接口。但是由于我需要同步两个属性,我想我可以对同一个字段使用两个不同的属性。属性将根据我对每个框架的需要而定,并且它们将相应地更新字段 因此,我有以下字段: private IList<Modulo> modulos; 私有IList模; 以及以下特性: [Xm
private IList<Modulo> modulos;
私有IList模;
以及以下特性:
[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);
}
}
[XmlIgnore]
公共虚IList模
{
获取{返回模;}
集合{modulos=value;}
}
[XmlArray]
[XmlArrayItem(typeof(Modulo))]
公共虚拟ArrayList XmlModulos
{
得到
{
if(modulos==null)返回新的ArrayList();
var aux=新的ArrayList();
foreach(模中的模m)
补充(m);
返回aux;
}
设置
{
模=新列表();
foreach(对象值为o)
模。加((模)o);
}
}
第一个很好用,很标准,但是我对第二个有一些问题。get工作得很好,因为序列化对象没有问题(这意味着它正确地从字段中获取信息)。但是当我需要反序列化时,它并没有得到所有的信息。调试器表示,在反序列化之后,字段未更新(null),属性为空(Count=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。见:
下面是支持映射到上述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;
}
}
公共类人物
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
静态人()
{
CreateMap();
CreateMap();
}
公众人士(个人至dto)
{
Map(dto,this);
}
公众人物
{
var dto=新的PersonDto();
Mapper.Map(this,dto);
返回dto;
}
}
您是否懒得加载集合?如果是这样,反序列化XML将不会加载它,因此计数为0。最简单但冗长的方法是专门为web创建一个包装器类,而不是传递NHibernate对象,这只是一个坏主意。