我有这种情况:
namespace MyApp.Animals
{
public class Dog : MyApp.Categories.Canine
...
所以我正在尝试序列化/反序列化狗类。不幸的是我不能使用[XmlInclude]属性,因为通过将它添加到父类(MyApp.Categories.Canine),我需要添加对父类所在的程序集的引用(MyApp.Animals)。但是由于继承,子类已经引用了父类...所以我们有一个循环引用。
有没有最佳实践方法来实现这一目标?我可以通过手动序列化/反序列化父类中存在的属性来解决它,并且只对子进行序列化,但这不是很优雅。
希望获得一些更好的提示..
更新:添加示例以回应John的评论......
我没有完整的代码示例(我正在使用的代码是庞大而复杂的),但是问题是应该对xml进行序列化/从xml序列化的某些属性包含在父类中,这是与子类不同的程序集。
将XmlElement属性添加到父类不起作用,因为我们实际上对子类进行了de / serialization,因此它不会迭代到父类。我们不能在父级上执行此操作,因为我们无法添加对子级的引用(因为子级已经引用了父级),因此de / serialiser将不知道要对哪个子级进行操作。
为了增加额外的复杂性,我遇到问题的对象实际上是通过父对象的以下属性进行de / serialized作为更大序列化的一部分:
[XmlElement("ShippingAddress")]
public Location ShippingAddress
{
get { return _shippingAddress; }
set { _shippingAddress = value; }
}
问题是这里的位置类型是子位置类型。因此,只有子类型中的属性被de / serialized ...父类型中的所有属性(也称为Location,但在不同的名称空间中)不是。
这会让它变得更清楚吗?
答案 0 :(得分: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))]