Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML Сериализация свойства, Как сериализовать следущее свойство 
V
    Опции темы
2belikespring
Дата 23.1.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



Добрый вечер!

Создал свойство для сериализации массива 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]);
            }

        }
PM MAIL   Вверх
1stain
Дата 23.1.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 8
Всего: 40



Код

        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 сериализации


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
1stain
Дата 23.1.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 8
Всего: 40



а вот этот метод я в самом деле нагуглил  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>

Это сообщение отредактировал(а) 1stain - 24.1.2008, 00:13


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
2belikespring
Дата 24.1.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



 smile  Ошибка была досадная)) 
Просто забыл инициализировать массив  smile   
set
            {
                TimeSpanArrayField = new TimeSpan[value.Length];
                for (int number = 1; number <= value.Length; number++)
                    TimeSpanArrayField[number - 1] = TimeSpan.Parse(value[number - 1]);
            }
PM MAIL   Вверх
likemusic
Дата 17.8.2013, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.2.2011

Репутация: нет
Всего: нет



В классе 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();
        }

PM MAIL   Вверх
gambit
Дата 19.8.2013, 12:41 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Время в .net хранится в тиках. Это обычный long, и логичнее сериализовать его
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0716 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.