我的问题与this问题有关。 我有一个POCO类,具有从子项到父项的虚拟导航属性。父母有一群孩子。
public class Parent
{
public virtual List<Child> Children { get; set; }
}
public class Child
{
public string ParentID { get; set; }
[XmlIgnore]
[ForeignKey("ParentID")]
public virtual Parent Parent { get; set; }
}
现在......你猜对了 - 我尝试使用XmlSerializer序列化来自EF(即代理)的父代。它首先抱怨我以某种方式处理的所有未知类型(动态生成的类)。但随后它出现了“循环引用”异常。
经过一些调查后发现原因是XmlIgnore属性不能通过对代理对象的Parent属性的反射来发现。
Type.GetType("System.Data.Entity.DynamicProxies.Child_2C9351FD5E156D94E5BF2C68DABFC2A956181C99A0C2E4E6B592E6373D8645ED, EntityFrameworkDynamicProxies-Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
.GetProperty("Parent").GetCustomAttributes(typeof(XmlIgnoreAttribute), true) <-- returns 'None'
代理对象的类型基类型是我的Child类。 XmlIgnoreAttribute
未设置Inherited标志,默认值为true,因此这应该有效。发生了什么事?
代理对象是否在于它的基类型?
如何在不编写“手动”xml序列化的情况下解决此问题(我需要使用XmlSerializer)。
更新: 事实证明,XMLSerializer不尊重看似错误的属性的“继承性”。这是一个错误还是设计?
答案 0 :(得分:0)
根据this msdn文章(备注部分):
'此方法忽略属性和事件的inherit参数。要在继承链中搜索属性和事件的属性,请使用Attribute.GetCustomAttributes方法的相应重载。'
所以这不需要对代理做任何事情。看一下这个例子:
public class Test
{
[XmlIgnore]
public virtual int Property { get; set; }
}
public class Derived : Test
{
public override int Property { get; set; }
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
typeof(Derived)
.GetProperty("Property")
.GetCustomAttributes(typeof(XmlIgnoreAttribute), true)
.Count());
Console.WriteLine(
Attribute.GetCustomAttributes(
typeof(Derived)
.GetProperty("Property"), true)
.Count());
}
}
和结果:
0
1
Press any key to continue . . .