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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация класса отнаследованного от List<T>, Не сериализует свойства 
:(
    Опции темы
FatherFrost
Дата 26.7.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почетный Мороз
**


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

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



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

Это сообщение отредактировал(а) FatherFrost - 26.7.2006, 14:12


--------------------
Задаю много глупых вопросов....
PM MAIL ICQ   Вверх
mr.DUDA
Дата 26.7.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



FatherFrost, сериализация бинарная или XML ? Если XML, то у свойства должен быть set-аксессор. 


--------------------
user posted image
PM MAIL WWW   Вверх
FatherFrost
Дата 26.7.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почетный Мороз
**


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

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



Используется XML сериализация, но при этом для свойства определены оба аксессора (и сет и гет). Так что вопрос проблема все таже. 


--------------------
Задаю много глупых вопросов....
PM MAIL ICQ   Вверх
FatherFrost
Дата 27.7.2006, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почетный Мороз
**


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

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



вот пример кода:
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.Xml;
using System.IO;

namespace WindowsApplication1
{
    /// <summary>
    /// Сериализуемый список
    /// </summary>
    [Serializable]
    [XmlRootAttribute("list", IsNullable = false)]
    public class MyList : List<string>
    {
        public MyList() { }

        /// <summary>
        /// Наименование списка
        /// </summary>
        protected string listname = "My List Name";
        [XmlElementAttribute("ListName")]
        public string ListName
        {
            get { return listname; }
            set { listname = value; }
        }

        /// <summary>
        /// Коментарий к списку
        /// </summary>
        protected string listnote = "My List Note";
        [XmlElementAttribute("ListNote")]
        public string ListNote
        {
            get { return listnote; }
            set { listnote = value; }
        }

        /// <summary>
        /// Сериализоваться
        /// </summary>
        public void Serialize(string filename)
        {
            Type target_type = this.GetType();
            FileStream Stream = new FileStream(filename, FileMode.Create);
            try
            {
                XmlSerializer fmt =
                    new XmlSerializer(target_type, "");
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");
                XmlTextWriter tw = new XmlTextWriter(Stream, Encoding.UTF8);
                tw.Formatting = Formatting.Indented;
                fmt.Serialize(tw, this, ns);
            }
            finally
            {
                Stream.Close();
            }
        }

    }
}

Задача его сериализовать.
Для это используем код:

        private void button1_Click(object sender, EventArgs e)
        {
            MyList TestList = new MyList();
            TestList.ListName = "TESTNAME";
            TestList.ListNote = "TESTNOTE";
            TestList.Add("TEST ITEM 1");
            TestList.Add("TEST ITEM 2");
            TestList.Add("TEST ITEM 3");
            TestList.Serialize("c:\\test.xml");
        }


Код

На выходе получаем следующий XML:
<?xml version="1.0" encoding="utf-8"?>
<list>
  <string>TEST ITEM 1</string>
  <string>TEST ITEM 2</string>
  <string>TEST ITEM 3</string>
</list>
А хотелось бы получить что-то вроде:
xml version="1.0" encoding="utf-8"?>
<list>
   <ListName>TESTNAME</ListName>
   <ListNote>TESTNOTE</ListNote>
  <string>TEST ITEM 1</string>
  <string>TEST ITEM 2</string>
  <string>TEST ITEM 3</string>
</list>
 

В чем здесь может быть проблема? 

Это сообщение отредактировал(а) FatherFrost - 27.7.2006, 07:42


--------------------
Задаю много глупых вопросов....
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.7.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Нашёл такую штуку в мсдн:

Цитата
Items That Can Be Serialized
The following items can be serialized using the XmLSerializer class:

- Public read/write properties and fields of public classes
- Classes that implement ICollection or IEnumerable

Note  
Only collections are serialized, not public properties.


Добавлено @ 10:59 
Как вариант, можно агрегировать список в другой объект и реализовать свойства там. 


--------------------
user posted image
PM MAIL WWW   Вверх
ALEXn
Дата 27.7.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если использовать агрегацию, то мы получим XML в виде

Код

<?xml version="1.0" encoding="utf-8"?>
<list>
   <ListName>TESTNAME</ListName>
   <ListNote>TESTNOTE</ListNote>
  <items>
     <string>TEST ITEM 1</string>
     <string>TEST ITEM 2</string>
     <string>TEST ITEM 3</string>
  </items>
</list>



Видимо все-таки придется формировать требуемый XML, не используя сериализацию, а напрямую.........

Вообще число элементов списка заранее известно, так что класс можно отнаследовать и от обычного object'а
Есть такой вариант: в классе будет 3 одинаковых элемента:
Код

        /// <summary>
        /// Итем1
        /// </summary>
        protected string item1 = "value item 1";
        [XmlElementAttribute("string")]
        public string Item1
        {
            get { return item1; }
            set { item1 = value; }
        }
        /// <summary>
        /// Итем2
        /// </summary>
        protected string item2 = "value item 2";
        [XmlElementAttribute("string")]
        public string Item2
        {
            get { return item2; }
            set { item2 = value; }
        }
        /// <summary>
        /// Итем3
        /// </summary>
        protected string item3 = "value item 3";
        [XmlElementAttribute("string")]
        public string Item3
        {
            get { return item3; }
            set { item3 = value; }
        }



Но при этом сериализация ругается, что элемент String
([XmlElementAttribute("string")]) может быть только один.

Задача у нас следующая:
получить валидный XML для общения с другой программой.
Думалось, что сериализация подходит для решения данной проблемы как нельзя кстати.
Видно все-таки не так....
 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.7.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



ALEXn aka FatherFrost, а почему под разными никами заходим ?

Добавлено @ 13:46 
З.Ы. по-моему вполне логично, что собственные проперти класса отделяются от коллекции объектов, которую этот класс (как потомок List<T>) реализует. Иначе непонятно было бы, к примеру, как десериализовать из XML, в котором у элементов коллекции и пропертей одинаковые теги (ведь такое в принципе можно организовать). 


--------------------
user posted image
PM MAIL WWW   Вверх
ALEXn
Дата 27.7.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1. Просто мы с FatherFrost'ом работаем в одной организации, т.е. коллеги.
И бьемся над общей проблемой.
Фактически вопрос мой.
Просто я сначала просил FatherFrost'а задать вопрос, а потом все-таки решил зарегистрироваться сам.
Извините пожалуйста, если что не так.

2. Да это логично.
Но десериализация нам собственно не нужна.
Мы подумали: а вдруг?, но видно ничего не получится....

Спасибо за ответы. 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.7.2006, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(ALEXn @  27.7.2006,  13:56 Найти цитируемый пост)
1. Просто мы с FatherFrost'ом работаем в одной организации, т.е. коллеги.
И бьемся над общей проблемой.
Фактически вопрос мой.
Просто я сначала просил FatherFrost'а задать вопрос, а потом все-таки решил зарегистрироваться сам.
Извините пожалуйста, если что не так.

Ok, welcome на форум smile

Цитата(ALEXn @  27.7.2006,  13:56 Найти цитируемый пост)
2. Да это логично.
Но десериализация нам собственно не нужна.
Мы подумали: а вдруг?, но видно ничего не получится....

Это ограничение фреймворка, и имхо вряд ли что-то получится сделать стандартными способами. 


--------------------
user posted image
PM MAIL WWW   Вверх
arilou
Дата 28.7.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



А если реализовать ISerializable и самим влиять на то, что пойдет в XML ? 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
ALEXn
Дата 31.7.2006, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А если реализовать ISerializable и самим влиять на то, что пойдет в XML ?  


А есть ли какой-нибудь примерчик?
Насколько сложна подобная реализация?

Или может все-таки будет проще формировать XML-документ вручную через XMLDocument ?  

Это сообщение отредактировал(а) ALEXn - 31.7.2006, 06:32
PM MAIL ICQ   Вверх
Ch0bits
Дата 31.7.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Ужас! Пробовал реализовать ISerializable, так там чёрт ногу сломит. Не проще ли вручную написать метод сериализации?
Код

            /// <summary>
            /// Сериализоваться
            /// </summary>
            public void Serialize(string filename)
            {
                using (StreamWriter sw = new StreamWriter(filename))
                {
                    sw.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
                    sw.WriteLine("<list>");
                    sw.WriteLine("<ListName>"+ListName+"</ListName>");
                    sw.WriteLine("<ListNote>"+ListNote+"</ListNote>");    
                    for (int i = 0; i < this.Count; i++)
                    {
                        sw.WriteLine("<string>" + this[i] + "</string>");
                    }
                    sw.WriteLine("</list>");
                }
            }
 
PM WWW   Вверх
ALEXn
Дата 31.7.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Примерно так и сделали.
Только с использованием 
    XmlDocument XML = new XmlDocument();
 
PM MAIL ICQ   Вверх
arilou
Дата 31.7.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Цитата(Ch0bits @  31.7.2006,  12:25 Найти цитируемый пост)
Ужас! Пробовал реализовать ISerializable, так там чёрт ногу сломит. Не проще ли вручную написать метод сериализации

Тоже вариант.  smile  


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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