C #, Почему XmlSerializer сериализует базовый объект вместо интерфейса? - PullRequest
1 голос
/ 18 апреля 2011

Почему XmlSerializer сериализует ВСЕ из Car при сериализации ICar?.. вместо просто сериализации A из ICar?

я нахожу это странным, потому что когда я смотрю это в отладчике, icars содержит только A, но test.xml имеет AB и C.

Пример кода:

//IMPLEMENTATION
Cars cars = new Cars(); 

ICars icars = cars;

var iXmls = new XmlSerializer(typeof(Cars));
using (TextWriter iTw = new StreamWriter("test.xml"))
{
    iXmls.Serialize(iTw, icar);
}

//CLASS  
[XmlRootAttribute("Cars")]
public class Cars : ICar
{
    private string _A = "Car A"; 
    private string _B = "Car B"; 
    private string _C = "Car C"; 

    public string A { /* get.. set.. */}
    public string B { /* get.. set.. */}
    public string C { /* get.. set.. */}
} 

//INTERFACE
public interface ICars
{
    string A; 
}

Результаты XML:

<Cars>
    <A>Car A</A>
    <B>Car B</B>
    <C>Car C</C>
<Cars>

Ожидал получить это (но не получил):

<Cars>
    <A>Car A</A>
<Cars>

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

Поскольку вы создали XmlSerializer, передав typeof(Cars) его конструктору. XmlSerializer не будет работать на типах интерфейса.

Если вы хотите игнорировать некоторые поля, вы можете использовать System.Xml.Serialization.XmlIgnoreAttribute в вашем классе. Смотрите этот пост .

1 голос
/ 18 апреля 2011

Нельзя десериализовать до ICar, так почему вы ожидаете сериализацию с ICar?

Просто создайте простой тип, который делает то, что вам нужно.

public class PlainOldCar : ICar
{
  public string A {get;set;}
  public PlainOldCar(ICar carSource) //copy constructor
  {
    this.A = carSource.A;
  }
}
...