Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > XML Сериализация свойства


Автор: 2belikespring 23.1.2008, 21:45
Добрый вечер!

Создал свойство для сериализации массива TimeSpan. Подскажите пожалуйста как его правильно сериализовать в XML, а то не проходит десериализация:

 public String[] XmlTimeSpan
        {
            get
            {
                string[] strings = new string[TimeSpanArrayField.Length];
                for (int number = 1; number <= TimeSpanArrayField.Length; number++)
                    strings[number - 1] = TimeSpanArrayField[number - 1].ToString();
                return strings;
            }
            set
            {
                for (int number = 1; number <= value.Length; number++)
                    TimeSpanArrayField[number - 1] = TimeSpan.Parse(value[number - 1]);
            }

        }

Автор: 1stain 23.1.2008, 22:37
Код

        private List<TimeSpan> timeSpans = new List<TimeSpan>();
        public String[] TimeSpans
        {
            get { return this.timeSpans.ConvertAll<String>(delegate(TimeSpan ts) { return ts.ToString(); }).ToArray(); }
            set { this.timeSpans = new List<TimeSpan>(Array.ConvertAll<string, TimeSpan>(value, delegate(string str) { return TimeSpan.Parse(str); })); }
        }


кстати, спасибо за информацию: не знал, что TimeSpan глючит при XML сериализации

Автор: 1stain 23.1.2008, 23:46
а вот этот метод я в самом деле нагуглил  smile , когда искал как сериализовать IDictionary в XML 

Код

    [Serializable]
    public class MyClass
    {
        private TimeSpanCollection timeSpans;
        public TimeSpanCollection TimeSpans
        {
            get { return this.timeSpans; }
            set { this.timeSpans = value; }
        }

        public MyClass()
        {
            this.timeSpans = new TimeSpanCollection();
        }

    }

    [Serializable]
    public class TimeSpanCollection : List<TimeSpan>, IXmlSerializable
    {
        #region IXmlSerializable Members

        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(System.Xml.XmlReader reader)
        {
            while( true)
            {
                if (!reader.ReadToFollowing("TimeSpan"))
                    break;
                reader.ReadStartElement();
                this.Add(TimeSpan.Parse(reader.Value));
            }
        }

        public void WriteXml(System.Xml.XmlWriter writer)
        {
            foreach( TimeSpan ts in this )
                writer.WriteElementString("TimeSpan", ts.ToString());
        }

        #endregion
    } 


преимущество по-моему налицо: добавляем класс TimeSpanCollection в проект и больше не паримся насчет сериализации List<TimeSpan>

Автор: 2belikespring 24.1.2008, 11:40
 smile  Ошибка была досадная)) 
Просто забыл инициализировать массив  smile   
set
            {
                TimeSpanArrayField = new TimeSpan[value.Length];
                for (int number = 1; number <= value.Length; number++)
                    TimeSpanArrayField[number - 1] = TimeSpan.Parse(value[number - 1]);
            }

Автор: likemusic 17.8.2013, 01:48
В классе TimeSpanCollection не совсем корректный метод ReadXm() - из-за вызова ReadToFollowing(), все что в XML-файле после TimeSpanCollection не десериализуется.

Исправленная версия метода:
Код

        public void ReadXml(System.Xml.XmlReader reader)
        {
            string XmlNodeName = "TimeSpan";
            if (reader.ReadToDescendant(XmlNodeName))
            {
                bool HasSibling = false;
                do
                {
                    reader.ReadStartElement();
                    this.Add(TimeSpan.Parse(reader.Value));
                    reader.Read();
                    HasSibling = reader.ReadToNextSibling(XmlNodeName);
                } while (HasSibling);
            }
            reader.Read();
        }

Автор: gambit 19.8.2013, 12:41
Время в .net хранится в тиках. Это обычный long, и логичнее сериализовать его

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)