【发布时间】: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