Получить имя элемента из дочернего класса - PullRequest
0 голосов
/ 02 февраля 2019

При создании XML из этого кода:

internal class Program
  {
    public static void Main(string[] args)
    {

      using (StreamWriter myWriter = new StreamWriter(@"C:\Users\tomas\Documents\foo.xml", false))
      {
        var myFoo = new Foo();
        myFoo.Bar = new BarChildOne();

        XmlSerializer mySerializer = new XmlSerializer(typeof(Foo));
        mySerializer.Serialize(myWriter, myFoo);
      }
    }
  }

  public class Foo
  {
    public BarBase Bar { get; set; }
  }

  [XmlInclude(typeof(BarChildOne))]
  [XmlInclude(typeof(BarChildTwo))]
  public abstract class BarBase
  {
    public string Name { get; set; }
  }

  [XmlRoot(ElementName = "BarChildOne")]
  public class BarChildOne : BarBase
  {
    public BarChildOne()
    {
      this.Name = "BarChildOne";
    }
  }

  [XmlRoot(ElementName = "BarChildTwo")]
  public class BarChildTwo : BarBase
  {
    public BarChildTwo()
    {
      this.Name = "BarChildTwo";
    }
  }

Создается такой XML-код:

<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Bar xsi:type="BarChildOne">
    <Name>BarChildOne</Name>
  </Bar>
</Foo>

Однако я хочу, чтобы имя элемента было BarChildOne , как определено с помощью в дочернем классе, а не Бар .

Ток: <Bar xsi:type="BarChildOne"> Ожидаемый: <BarChildOne>

Еслипроизводный класс - BarChildTwo, тогда ожидаемое имя - <BarChildTwo>.

Возможно ли это со встроенным сериализатором XML?

1 Ответ

0 голосов
/ 02 февраля 2019

Обновление имени переменной внутри Foo:

public class Foo
{
    public BarBase BarChildOne { get; set; }
}

и обновление имени ссылочной переменной внутри сериализации:

using (StreamWriter myWriter = new StreamWriter(@"C:\temp\foo.xml", false))
{
    var myFoo = new Foo();
    myFoo.BarChildOne/**/ = new BarChildOne();

    XmlSerializer mySerializer = new XmlSerializer(typeof(Foo));
    mySerializer.Serialize(myWriter, myFoo);
}

дает запрошенный результат:

Я хочу, чтобы имя элемента было BarChildOne, как определено в дочернем классе, а не Bar.

<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <BarChildOne xsi:type="BarChildOne">
    <Name>BarChildOne</Name>
  </BarChildOne>
</Foo>
...