XmlSerializer не сериализует пользовательский тип - PullRequest
3 голосов
/ 19 сентября 2011

Я пытаюсь сериализовать, используя следующий код

var data = argsPerCall.ToArray();
var knownTypes = new[] { typeof(int), typeof(int),  
                         typeof(string), typeof(McPosition)};

var serializer = new XmlSerializer(data.GetType(), knownTypes);
// Writing the file requires a TextWriter.
var myStreamWriter = new StreamWriter(filename);
serializer.Serialize(myStreamWriter, data);
myStreamWriter.Close();

У меня проблема с типом McPosition.

Для следующего ввода

5 , 1, "R251" , {1,2,3}

Iполучаю следующую сериализацию

<ArrayOfAnyType>
    <anyType xsi:type="xsd:int">5</anyType>
    <anyType xsi:type="xsd:int">1</anyType>
    <anyType xsi:type="xsd:string">R251</anyType>
    <anyType xsi:type="McPosition" />
  </ArrayOfAnyType>

Есть идеи, почему она не была правильно сериализована?

РЕДАКТИРОВАТЬ:

public struct McPosition : IComparable<McPosition> {
    private readonly int _station;
    private readonly int _slot;
    private readonly int _subslot;


    public static McPosition Empty = new McPosition(-1, -1, -1);


    public McPosition(int station, int slot, int subslot) {
      _station = station;
      _slot    = slot;
      _subslot = subslot;
    }

и т. д..

Ответы [ 2 ]

5 голосов
/ 19 сентября 2011

Чтобы быть сериализуемым через XmlSerializer, каждое свойство типа должно иметь общедоступный метод получения и установки (и не быть помеченным [XmlIgnore], а также не иметь ShouldSerialize*(), который возвращает false и т. Д.).Открытые поля также сериализуются (если они не readonly), но предоставление полей еще менее желательно.XmlSerializer никогда не смотрит на частных пользователей.

Я угадываю (редактировать: теперь подтверждено обновленным вопросом), что McPosition является неизменным вектором,без публичных сеттеров.Это не сработает.Опции:

  • реализовать IXmlSerializable (если честно, не слишком приятно)
  • добавить общедоступные сеттеры в McPosition
  • использовать отдельный DTO, который полностьюизменяемый
2 голосов
/ 19 сентября 2011

Вы должны добавить общедоступный метод получения и установки для сериализуемых полей XML. Здесь: станция, слот и подслот.

...