2010-06-25 52 views
2

我有这样的场景:XmlInclude到(反)序列继承类型在单独的程序集

namespace MyApp.Animals 
{ 
    public class Dog : MyApp.Categories.Canine 
    ... 

所以我想序列化/反序列化的狗类。不幸的是,我不能使用[XmlInclude]属性,因为通过将它添加到父类(MyApp.Categories.Canine),我需要添加对父类存在的程序集的引用(MyApp.Animals)..然而,由于继承,子类已经引用父类...所以我们有一个循环引用。

是否有任何实现此目的的最佳实践方式?我可以通过手动序列化/反序列化父类上存在的属性来解决这个问题,并且只是在子节点上进行序列化,但这不是很优雅。

盼望一些更好的技巧..

UPDATE:添加到例如响应下面约翰的评论...

我没有一个完整的代码示例(我用的工作代码大规模和复杂的),但问题是,应该去/从xml序列化的一些属性包含在父类中,该父类与子类不同。

将XmlElement属性添加到父类不起作用,因为我们实际上正在对子类进行de/serialization,因此它不会迭代到父级。而且我们不能在父对象上做,因为我们不能添加对孩子的引用(因为孩子已经在引用父对象),所以de/serialiser将不知道要对哪个孩子进行操作。

要增加复杂性的一个额外的水平,我与实际上被取消/序列化为更大的序列的一部分,由父对象的下列财产问题的对象:

[XmlElement("ShippingAddress")] 
    public Location ShippingAddress 
    { 
     get { return _shippingAddress; } 
     set { _shippingAddress = value; } 
    } 

的问题在于这里的位置类型是子位置类型。因此,只有子类型的属性才会变为de/serialized ...父类型(也称为Location,但在不同的名称空间中)中的所有属性都不是。

这是否使它更清晰?

+0

能否请你告诉代码和生成的XML?目前还不清楚为什么你需要'XmlInclude'。 – 2010-06-25 00:42:44

+0

我已经更新了我原来的帖子.. – Jeeby 2010-06-25 01:42:26

回答

1

XmlSerializer有一个constructor,它接受一个名为“extraTypes”类型的数组。就像添加了XmlInclude属性一样,此数组中的类型将在序列化和反序列化过程中可用。

var serializer = new XmlSerializer(typeof(Canine), new Type[] { typeof(Dog) }); 

更新:这种方法只如果XML包括xsi:type属性当类型为从什么是声明的根对象上的不同。这听起来像你可能只是总是将该属性反序列化为另一种类型。在这种情况下,您可以使用XmlAttributeOverrides替换原始类型的元数据。构建XmlSerializer的是这样的:

var overrides = new XmlAttributeOverrides(); 
var xmlAttributes = new XmlAttributes(); 
xmlAttributes.XmlElements.Add(new XmlElementAttribute("ShippingAddress", typeof(ITSM.Location))); 
overrides.Add(typeof(Order), "Location", xmlAttributes); 
var ser = new XmlSerializer(typeof(Order), overrides); 

将与上Order.Location属性替换的属性相同的效果:

[XmlElement("ShippingAddress", typeof(ITSM.Location))] 
+0

是啊..我已经试过 - 没有工作。我认为,因为我实际上调用父对象上的反序列化,而不是与我有问题的对象: //将收到的XML反序列化为Order对象 Type [] types = {typeof(Common。位置),typeof(ITSM.Location)}; Order o =(Order)EntityUtils.DeserializeObject (d.DocumentElement,types); – Jeeby 2010-06-25 06:39:44