powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Custom Serialization : десериализация объекта с ArrayList членом.
3 сообщений из 3, страница 1 из 1
Custom Serialization : десериализация объекта с ArrayList членом.
    #38399124
Фотография Фесенко Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C# (FW 3.5)
У меня имеется класс (сериализуемый), в котором только одно открытое поле типа ArrayList. Затем свойство ArrayList заполняется объектами класса, только сериализуемого вручную(!). Сериализация выполняется хорошо (это видно из слепка, помещённого в файл), а вот десериализация восстанавливает ArrayList неполностью: память под "массив" выделяется, а сами объекты (класса наследуемого от ISerializable) = null . Вопрос, почему? Ниже пример, описывающий мою проблему:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
using System;
using System.Windows.Forms;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;

namespace ISerializeTest
{
    class Program
    {
        [STAThread()]
        static void Main(string[] args)
        {
            Student stud = new Student { Name = "Вася", Id = 13, Nicknames =
                new ArrayList(new Nickname[] {
                    new Nickname() { Nick = "Банан", Year=1993 },
                    new Nickname() { Nick = "Персик" ,Year =1999},
                    new Nickname() { Nick = "Пушок", Year=2003 } })
            };

            BinaryFormatter binaryFmt = new BinaryFormatter();
            System.IO.Stream fs = new System.IO.MemoryStream();
            binaryFmt.Serialize(fs, stud);


            fs.Position = 0;
            BinaryFormatter bf2 = new BinaryFormatter();
            Student st2 = (Student)bf2.Deserialize(fs);
            fs.Close();
        }
    }

    [Serializable]
    class Student
    {
        public int Id { get; set; }
        public String Name { get; set; }
        public ArrayList Nicknames  { get; set; }
    }

    [Serializable]
    class Nickname : Control, ISerializable
    {
        public string Nick { get; set; }
        public int Year { get; set; }
        public Nickname() { }
        public Nickname(SerializationInfo info, StreamingContext context)
        {
            base.Text = info.GetString("_text");
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("_text", this.Name);
        }
    }
}


Спасибо, заранее.
PS XML Сериализацию не предлагать.
...
Рейтинг: 0 / 0
Custom Serialization : десериализация объекта с ArrayList членом.
    #38399157
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фесенко Олег, класс Nickname реализует интерфейс ISerializable и содержит конструктор с аргументами SerializationInfo/StreamingContext. Таким образом ты сам решаешь что и как сериализовывать. Метод GetObjectData вызывается при сериализации. В нем ты сохраняешь только поле Name. Конструктор вызывается при десериализации. В нем читаешь значение в поле Text. Соотственно другие поля просто игнорируются. Добавь в эти методы сохранение/восстановление других полей класса и увидишь разницу:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
protected Nickname(SerializationInfo info, StreamingContext context)
{
	base.Text = info.GetString("_text");
	Nick = info.GetString("Nick");
	// и т.д.
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
	info.AddValue("_text", this.Name);
	info.AddValue("Nick", Nick);
	// и т.д.
}



P.S. Обрати внимание что конструктор поддерживающий сериализацию лучше сделать protected (если класс создается для наследования) или private.

P.S. Похоже в коде сериализации есть ошибка. Ты сохраняешь поле Name, а восстанавливаешь поле Text. Ты уверен что именно так и нужно?
...
Рейтинг: 0 / 0
Custom Serialization : десериализация объекта с ArrayList членом.
    #38399166
Фотография Фесенко Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,
Спасибо, действительно напутал со свойсвами. К тому же спасибо за совет от-но закрытых конструкторов.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Custom Serialization : десериализация объекта с ArrayList членом.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]