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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация List<> 
:(
    Опции темы
liri2006
Дата 7.12.2010, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть класс:
Код

public class MakeLabel1
        {
            private Label m_Label { get; set; }
            private Canvas m_Canvas { get; set; }
            private BloodAnalizData bloodData;

            public MakeLabel1()
            { }
            public MakeLabel1(bloodAnaliz window, Canvas canvas)
            {
                m_Canvas = new Canvas();
                m_Label = new Label();
                m_Canvas = canvas;

                bloodData = new BloodAnalizData(window);
                
                Thickness th = new Thickness();
                th.Top += labelMargin;
                m_Label.Margin = th;
                labelMargin += 20;
                m_Label.Content = window.date.Text;
                m_Label.MouseDown += new MouseButtonEventHandler(m_Label_MouseDown);
                m_Label.MouseDoubleClick += new MouseButtonEventHandler(m_Label_MouseDoubleClick);
                
            }
            public Label getLabel()
            {
                return m_Label;
            }
            private void m_Label_MouseDoubleClick(object sender, MouseButtonEventArgs e)
            {
                bloodAnaliz newWindow = new bloodAnaliz(bloodData);
                newWindow.ShowDialog();
                if (newWindow.okIsClicked)
                {
                    bloodData.SetNew(newWindow);
                    m_Label.Content = newWindow.date.Text;
                }
            }
            private void m_Label_MouseDown(object sender, MouseButtonEventArgs e)
            {
                foreach (Label a in m_Canvas.Children)
                    a.Foreground = Brushes.Black;
                if (sender is Label)
                    ((Label)sender).Foreground = Brushes.Blue;
            }
        }

Созданные объекты добавляю в List<MakeLabel1>:
Код

label1.Add(new MakeLabel1(Blood1,canvasBlood));

Подскажите как правильно сериализировать List<MakeLabel1> label1, пробовал так:
Код

XmlSerializer s = new XmlSerializer(typeof(List<MakeLabel1>));
            using (FileStream fs = new FileStream("1.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                s.Serialize(fs, label1);
            } 

Но в созданном файле есть только:
Код

<?xml version="1.0"?>
<ArrayOfMakeLabel1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MakeLabel1 />
  <MakeLabel1 />
  <MakeLabel1 />
</ArrayOfMakeLabel1>

Кэп подсказывает что хреново оно сохраняется))
PM MAIL   Вверх
Rohoss
Дата 7.12.2010, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

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



нужно атрибут [Serializable()] перед классом ставить

Добавлено через 53 секунды
Код

[Serializable]
public class MakeLabel1
        {
            private Label m_Label { get; set; }
            private Canvas m_Canvas { get; set; }
            private BloodAnalizData bloodData;
            public MakeLabel1()
            { }
            public MakeLabel1(bloodAnaliz window, Canvas canvas)
            {
                m_Canvas = new Canvas();
                m_Label = new Label();
                m_Canvas = canvas;
                bloodData = new BloodAnalizData(window);
                
                Thickness th = new Thickness();
                th.Top += labelMargin;
                m_Label.Margin = th;
                labelMargin += 20;
                m_Label.Content = window.date.Text;
                m_Label.MouseDown += new MouseButtonEventHandler(m_Label_MouseDown);
                m_Label.MouseDoubleClick += new MouseButtonEventHandler(m_Label_MouseDoubleClick);
                
            }
            public Label getLabel()
            {
                return m_Label;
            }
            private void m_Label_MouseDoubleClick(object sender, MouseButtonEventArgs e)
            {
                bloodAnaliz newWindow = new bloodAnaliz(bloodData);
                newWindow.ShowDialog();
                if (newWindow.okIsClicked)
                {
                    bloodData.SetNew(newWindow);
                    m_Label.Content = newWindow.date.Text;
                }
            }
            private void m_Label_MouseDown(object sender, MouseButtonEventArgs e)
            {
                foreach (Label a in m_Canvas.Children)
                    a.Foreground = Brushes.Black;
                if (sender is Label)
                    ((Label)sender).Foreground = Brushes.Blue;
            }
        }



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
liri2006
Дата 7.12.2010, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хм, ничего не поменялось...
PM MAIL   Вверх
jonie
Дата 7.12.2010, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



liri2006, потому что нужно сделать из приватных полей публичные property c get;set методами
Только не очень понятно что вы будете сериализовать...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ivankult
Дата 7.12.2010, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я обычно сериализую тип object, а десериализую нужный мне тип. Вот 2 функции.

1. Сериализация любого объекта:

Код

public static string SerializeObj(object obj)
        {
            try
            {
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                StringBuilder builder = new StringBuilder();
                StringWriter writer = new StringWriter(builder, System.Globalization.CultureInfo.InvariantCulture);
                serializer.Serialize(writer, obj);
                return builder.ToString();
            }
            catch (Exception exception) { ErrorReport(exception); return null; }
        }


2. Десериализует ArrayList

Код

public static ArrayList DeserializeList(string xmlString)
        {
            try
            {
                StringReader reader = new StringReader(xmlString);
                XmlSerializer dsr = new XmlSerializer(typeof(ArrayList));
                ArrayList list = (ArrayList)dsr.Deserialize(reader);
                return list;
            }
            catch (Exception exception) { ErrorReport(exception); return null; }
        } 

--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
liri2006
Дата 7.12.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поставил поля в public  и теперь выкидывает ошибку "Возникла ошибка при отражении типа "System.Collections.Generic.List`1", в чем может быть проблема?
PM MAIL   Вверх
Rohoss
Дата 7.12.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

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



Цитата(liri2006 @  7.12.2010,  12:53 Найти цитируемый пост)
Поставил поля в public  и теперь выкидывает ошибку "Возникла ошибка при отражении типа "System.Collections.Generic.List`1", в чем может быть проблема?

Весь код приведи 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
liri2006
Дата 7.12.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В моем первом посте весь относящийся к теме код.
PM MAIL   Вверх
gambit
Дата 7.12.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



В листе есть наследники от MakeLabel1???
PM MAIL ICQ Skype   Вверх
liri2006
Дата 7.12.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В листе объекты MakeLabel1.
PM MAIL   Вверх
gambit
Дата 7.12.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Заведи класс который будет хранить коллекцию и сериализуй его, так:
Код

SerializationList sls = new SerializationList(); // класс который хранит коллекцию

            XmlAttributes attrs = new XmlAttributes();
            attrs.XmlArrayItems.Add(new XmlArrayItemAttribute("", typeof(Класс который хранит лист))); // эта строка повторяется столько раз, сколько в листе типов
             XmlAttributeOverrides attrOver = new XmlAttributeOverrides();
            attrOver.Add(sls.GetType(), "ля-ля", attrs);

            XmlSerializer serializer = new XmlSerializer(typeof(SerializationList), attrOver);
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add(string.Empty, string.Empty);

            using (FileStream file = new FileStream("Путь", FileMode.Create))
            {
                XmlTextWriter xmlWriter = new XmlTextWriter(file, Encoding.UTF8);
                xmlWriter.WriteStartDocument();
                serializer.Serialize(xmlWriter, sls, ns);
            }


Добавлено через 1 минуту и 37 секунд
С помощью этого кода, ты в последствии, легко расширишь сохранение, например добавляя новые типы в лист или инструкции препроцессора

Добавлено через 3 минуты и 27 секунд
А класс для хранения листа будет выглядить примерно так
Код

    [XmlInclude(typeof(Имя класса))]
    [XmlInclude(typeof(Имя класса))]
    [XmlRoot("Главный_элемент")]
    public class SerializationListShapes
    {
        [XmlArray("Тра-ля-ля")]
        [XmlArrayItem("Имя элемента для класса", Type = typeof(Имя класса)),
        ]
        public  List<Имя класса> LS {get; set;}

        public SerializationListShapes(List<Имя класса> ls)
        {
            LS = ls;
        }

        SerializationListShapes()
        { }
    }

PM MAIL ICQ Skype   Вверх
Ionitte
Дата 7.12.2022, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
scalosale
Дата 8.2.2023, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

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

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


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

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


 




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


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

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