簡體   English   中英

XmlInclude在單獨的程序集中對(繼承)序列化繼承的類型

[英]XmlInclude to (De)Serialize Inherited Types in Separate Assemblies

我有這種情況:

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

所以我正在嘗試對狗類進行序列化/反序列化。 不幸的是,我無法使用[XmlInclude]屬性,因為通過將其添加到父類(MyApp.Categories.Canine)中,我需要添加對父類所在的程序集(MyApp.Animals)的引用。但是由於繼承,子類已經在引用父類了……所以我們有一個循環引用。

有沒有實現這一目標的最佳實踐方法? 我可以通過手動對父類上存在的屬性進行序列化/反序列化,然后對子級進行序列化來解決此問題,但這不是很優雅。

希望有一些更好的技巧。

更新:添加到示例中,以回應以下約翰的評論...

我沒有完整的代碼示例(我正在使用的代碼龐大且復雜),但是問題是應該從xml反序列化/從xml序列化的某些屬性包含在父類中,該類位於與子類不同的程序集。

將XmlElement屬性添加到父類無法正常工作,因為我們實際上是在子類上進行反序列化,因此它不會迭代到父類。 而且我們無法在父項上執行此操作,因為我們無法添加對子項的引用(因為子項已經在引用父項),因此de / serializer不會知道要對哪個子項進行操作。

為了增加額外的復雜性,實際上,我遇到問題的對象通過父對象的以下屬性被反序列化為更大的序列化的一部分:

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

問題在於這里的位置類型是子位置類型。 因此,只有子類型中的屬性被反序列化...父類中的所有屬性(也稱為Location,但在differentnet命名空間中)都沒有。

這樣更清楚了嗎?

XmlSerializer具有一個構造函數 ,該構造函數接受稱為“ extraTypes”的類型的數組。 就像您添加了XmlInclude屬性一樣,此數組中的類型在序列化和反序列化期間將可用。

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

更新:如果您的Xml在根對象上聲明的類型不同時,它的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))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM