Helpers - компьютеры, интернет, программирование

IXmlSerializable

Не могли бы вы, ребята, помочь мне, у меня проблема с десериализацией через IXmlSerializable

var ArrayOfAccounts = new Accounts(); //This class structure I'm trying to read

Class Accounts:List<Session>{ }

Class Shedule{
  public DateTime StartAt { get; set; }
  public DateTime EndAt { get; set; }
}

Class Session:IXmlSerializable {
 public string Name{get;set;}
 public string Pass{get;set;}
 public List<Shedule> Shedules = new List<Shedule>();


 public void ReadXml(System.Xml.XmlReader reader){
    //AND HERE IS A PROBLEM. I don't know how to implement right code here. I've tried 
    //code below, but this one works for the first account only, and doesn't restore others 

  Schedules.Clear();
  XmlReader subR = reader.ReadSubtree();

  if (reader.MoveToAttribute("Name"))
      Name = reader.Value;
   if (reader.MoveToAttribute("Password"))
      Password = reader.Value;

 reader.MoveToContent();

 while (subR.ReadToFollowing("Schedule"))
        {
            XmlSerializer x = new XmlSerializer(typeof(Schedule));
            object o = x.Deserialize(subR);
            if (o is Schedule) Schedules.Add((Schedule)o);
        }
 }

А сам xml выглядит так:

<Accounts>
   <Session UserName="18SRO" Password="shalom99">
     <Schedule>
      <StartAt>0001-01-01T09:30:00</StartAt>
      <EndAt>0001-01-01T16:00:00</EndAt>
    </Schedule>
  </Session>
</Accounts>
26.06.2009

Ответы:


1

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

Ваша структура не выглядит слишком сложной, есть ли какая-то особая причина, по которой вы не используете атрибуты сериализации вместо ручной десериализации?

26.06.2009
  • Я хочу добавить алгоритм расшифровки пароля позже. И я не хочу возиться с унаследованными полями. Вот почему я решил использовать IXmlSerializable... На самом деле моя проблема заключается в чтении вложенных полей.. например, ‹foo› ‹child name=A› ‹/child› ‹child name=B› ‹/child› ‹/foo› 26.06.2009
  • Это также легко сделать — достаточно иметь два свойства: одно игнорируется XML (ваша нерасшифрованная версия) и сериализованная версия (расшифрованная версия). 26.06.2009
  • не понимаю... У меня есть класс, унаследованный от другого. И я хочу игнорировать унаследованные члены во время сериализации. как это сделать? 26.06.2009
  • Мой первоначальный комментарий был для обработки случая пароля/хешированного пароля. Что касается сокрытия унаследованных членов, я не думаю, что есть хороший способ сделать это напрямую. Я использовал прокси-классы сериализации, но вам может быть лучше написать собственную десериализацию. Однако я хотел бы задать один вопрос: почему вы хотите удалить унаследованные поля? Поскольку я мог установить значения в коде, мне (как потребителю вашего класса) показалось бы странным, что эти значения не отображаются в моем сериализованном XML. 26.06.2009

  • 2

    Повторно унаследованные поля... если вы переключитесь на DataContractSerializer, тогда поля будут "входить", а не "отказываться" - но вы теряете возможность указывать атрибуты (все является элементом). Банальный пример:

    [DataContract(Name="foo")]
    public class Foo
    {
        [DataMember(Name="bar")]
        public string Bar { get; set; }
    
        public int ThisIsntSerialized {get;set;}
    }
    

    Однако добавление неожиданных подклассов является проблемой как для XmlSerializer, так и для DataContractSerializer. Оба могут это сделать, но это некрасиво...

    26.06.2009
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..