Сериализация списка строк как атрибута

1

Я работаю с XML-сериализацией, до сих пор делаю это хорошо. Тем не менее, я наткнулся на проблему, и мне жаль, если вы, ребята, не сможете мне помочь.

У меня есть класс:

public class FrameSection
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlAttribute]
    public string[] StartSection { get; set; }
}

После сериализации я получил что-то вроде этого:

<FrameSection Name="VAR1" StartSection="First circle Second circle"/>

Проблема заключается в десериализации, я получил четыре элемента, а не два, поскольку пространство используется как разделитель, интересно, могу ли я использовать другой разделитель.

Примечание. Я знаю, что могу удалить [XmlAttribute] чтобы решить проблему, но я предпочитаю эту структуру, потому что она более компактна.

Код сериализации:

using (var fileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Create))
{
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ModelElements));
    System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
    settings.Indent = true;
    settings.Encoding = Encoding.UTF8;
    settings.CheckCharacters = false;
    System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(fileStream, settings);
    serializer.Serialize(writer, allElements);
}
Теги:
list
serialization

2 ответа

3
Лучший ответ

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

public class FrameSection
{
   [XmlAttribute]
   public string Name { get; set; }

   [XmlIgnore]
   public string[] StartSection { get; set; }

   [XmlAttribute("StartSection")]
   public string StartSectionText
   {
      get { return String.Join(",", StartSection); }
      set { StartSection = value.Split(','); }
   }
}

Я использовал здесь запятую как разделитель элементов массива, но вы можете использовать любой другой символ.

  • 2
    Хорошее решение. Я бы предложил оператору использовать какой-нибудь непечатаемый символ, чтобы избежать неправильного соединения строки.
  • 0
    Хороший, это определенно решит мою проблему, но я считаю, что это должно быть добавлено в XmlAttributeClass
0

Я не знаю, как изменить поведение сериализации массива, но если вы сделаете следующее изменение в своем классе FrameSection, вы должны получить желаемое поведение.

public class FrameSection
{
    [XmlAttribute]
    public string Name { get; set; }

    public string[] StartSection { get; set; }

    [XmlAttribute]
    public string SerializableStartSection
    {
        get
        {
            return string.Join(",", StartSection);
        }

        set
        {
            StartSection = value.Split(',');
        }
    }
}
  • 1
    Я считаю, что вы должны добавить [XmlIgnore] для свойства "StartSection"
  • 0
    Это не обязательно. Указанный дизайн класса дает желаемые результаты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню