Вот фрагмент кода, объясняющий мой вопрос:

public class TheBaseClass 
{
   public list<int> BaseClassList {get; set;}
}

public class TheDerivedClass : TheBaseClass
{
   //here I want to indicate the XmlSerializer to serialize the 'BaseClassList' with a different name 'DerivedClassList'
}

Я знаю, как это сделать, если переменная находится в том же классе, используя [XmlElement( ElementName = "DesiredVarName")], но хочу знать, возможно ли это вообще сделать в производном классе? Если да, то как?

2
Umar T. 18 Апр 2016 в 11:19

2 ответа

Лучший ответ

Судя по вашему комментарию, вы можете вносить изменения в TheBaseClass. Таким образом, вы можете добавить виртуальный метод bool ShouldSerialize{PropertyName}() для { {X2}} в базовом классе и верните true. Затем переопределите его в производном классе и верните false и введите свойство прокси с желаемым именем:

public class TheBaseClass
{
    public List<int> BaseClassList { get; set; }

    public virtual bool ShouldSerializeBaseClassList() { return true; }
}

public class TheDerivedClass : TheBaseClass
{
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
    public List<int> DerivedClassList { get { return BaseClassList; } set { BaseClassList = value; } }

    public override bool ShouldSerializeBaseClassList() { return false; }
}

Для объяснения того, почему это работает, см. Определение значений по умолчанию с помощью методов ShouldSerialize и Reset .

1
dbc 23 Апр 2016 в 07:26

На ум приходит одна вещь: использовать XmlAttributeOverrides:

var attributes = new XmlAttributes();
attributes.XmlElements.Add(new XmlElementAttribute("DerivedClassList"));
var overrides = new XmlAttributeOverrides();
overrides.Add(typeof(TheBaseClass), "BaseClassList", attributes);

var serializer = new XmlSerializer(typeof(TheDerivedClass), overrides);

В этом примере мы программно передаем XmlSerializer список настраиваемых атрибутов сериализации, которые будут применяться.

0
Darin Dimitrov 18 Апр 2016 в 08:27