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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с серилизацией иерархии классов 
V
    Опции темы
tol05
Дата 17.4.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Всем привет.
Есть у меня несколько библиотек классов, я над ними создал свои оболочки и их юзаю. Стал вопрос о серилизации моих объектов в MemoryStream. Сторонние библиотеки серилизацию не допускают. Не допускают они, честно говоря, многое, поэтому оболочки и написал.

Так вот, свои классы я пометил как [Serializable], реализовал в них ISerializable, а уже в нем, в GetObjectData(), ручками серилизую поля чужих классов. В принципе получается. Но вот интересная фигня (пишу псевдокод) :
Есть сторонние классы
Код

public class A{}
public class B{public A aList}
 
От них я сделал
Код

[Serializable] 
public class MyA, ISerializable 
{
  private A a;

  protected MyA(SerializationInfo info, StreamingContext context)
  {
    //тут десерилизуются поля базового класса А
  }

  public void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.SetType(typeof(MyA));
    SomeOldData d = ....; //Выбирается нужное из a
    info.AddValue("data", d);
  }
}

[Serializable]
public class MyB, ISerializable 
{
  private List<MyA> aList

  protected MyB(SerializationInfo info, StreamingContext context)
  {
    //MyA a = (A)info.GetValue("mya", typeof(MyA));
        
    aList = (List<MyA>)info.GetValue("myaList", typeof(List<MyA>));
  }

  public void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.SetType(typeof(MyB));
    //info.AddValue("mya", new MyA());
    info.AddValue("myaList", aList);
  }
}
 

так вот, если раскомментировать строчки в MyВ, то все нормально получается, в конструкторе B(SerializationInfo info, StreamingContext context) создается а, aList заполнен. При этом, в десерилизации поток выполнения входит в MyA(SerializationInfo info, StreamingContext context).
Но если оставить как есть, то aList создан, но содержит null вместо items, в конструктор MyA поток не входит.

Подскажите, в чем ошибка, плиз.

Это сообщение отредактировал(а) tol05 - 17.4.2007, 10:05


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
mr.DUDA
Дата 17.4.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(tol05 @  17.4.2007,  09:03 Найти цитируемый пост)
Но если оставить как есть, то aList создан, но содержит null вместо items, в конструктор MyA поток не входит.

Это прикол с так называемым "zeroed object state" -- объекты при бинарной десериализации создаются минуя конструктор (!), и все поля содержат дефолтные значения - например, int-ы будут в 0, bool - в false, ссылки - null.


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


Новичок



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

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



Попробуй так info.AddValue("myaList", aList,typeof(List<MyA>));

ЗЫ:Если оболочка MyA сериализуема, то кустомную сериализацию MyB можно было не делать.

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


Эксперт
***


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

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



for mr.DUDA  - Херовый прикол smile
for Grub - пока не помогает smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
mr.DUDA
Дата 17.4.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



tol05, ну что сделать если мелкомягкие так придумали... Ручками придётся поля заполнять, раз ISerializable поюзали.


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


Новичок



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

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



смотри пример

Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace TestCSConsoleApplication1
{
    class A
    {
        public int m_iValue = 0;
    }
    class B
    {
        public List<A> m_listA = new List<A>();
    }

    [Serializable]
    class MyA:ISerializable
    {
        public A m_a = new A();

        public MyA() {
        }
        protected MyA(SerializationInfo info, StreamingContext context) {
            //m_a = new A();//добавляеш, если в описании A m_a;
            m_a.m_iValue = (int)info.GetValue("m_a.m_iValue", m_a.m_iValue.GetType());
        }
        #region ISerializable Members
        public void GetObjectData(SerializationInfo info, StreamingContext context) {
            info.AddValue("m_a.m_iValue", m_a.m_iValue);
        }
        #endregion
    }

    [Serializable]
    class MyB
    {
        public List<MyA> m_listMyA = new List<MyA>();
    }


    class Program
    {

        static void Main(string[] args) {

            MyB myB = new MyB();
            MyA myA = new MyA();
            myA.m_a.m_iValue = 200;

            MyB myB2;

            myB.m_listMyA.Add(myA);

            using(MemoryStream ms = new MemoryStream()) {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, myB);

                ms.Position = 0;

                myB2 = (MyB)bf.Deserialize(ms);

            }
        }
    }
}


PM MAIL   Вверх
tol05
Дата 17.4.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Короче, зафиксал я проблему. Баг нашел при десерилизации списка. 
Пример Grub работает, да и мой тоже. Хлопотное дело, кустомная серилизация, внимания требует.


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

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


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

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


 




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


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

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