Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,混合Xml序列化和Nhibernate的问题_C#_Nhibernate_Xml Serialization - Fatal编程技术网

C#,混合Xml序列化和Nhibernate的问题

C#,混合Xml序列化和Nhibernate的问题,c#,nhibernate,xml-serialization,C#,Nhibernate,Xml Serialization,我正在开发一个程序,该程序使用Nhibernate来持久化对象,并使用Xml序列化来导入和导出数据。我不能对集合使用相同的属性,例如,Nhibernate需要它们成为Ilists,因为它有自己的接口实现,并且我不能序列化接口。但是由于我需要同步两个属性,我想我可以对同一个字段使用两个不同的属性。属性将根据我对每个框架的需要而定,并且它们将相应地更新字段 因此,我有以下字段: private IList<Modulo> modulos; 私有IList模; 以及以下特性: [Xm

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

因此,我有以下字段:

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对象,这只是一个坏主意。