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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по Serializable, с внешними dll-ками 
:(
    Опции темы
Wanderer2019
Дата 12.1.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет!
Хотел интересующую меня информацию запихнуть в двоичный файл.
Есть Класс который я для себя написал. Перед классом поставил аттрибут [Serializable]
т.е. имеем объект
Код

VssTest Vss=new VssTest();

При написании этого класса учавствовала dll-ка SourceSafeTypeLib.

При попытке
Код

serializer.Serialize(myFileStream, myVss);

Выскакивает Exception:
The type SourceSafeTypeLib.VSSItemClass in Assembly Interop.SourceSafeTypeLib, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null is not marked as serializable.

Значит ли это, что сериализовать объект МОЕГО класса в файл не представляется возможным???


PM ICQ MSN   Вверх
Exception
Дата 12.1.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Приведи код класса. Ты не сможешь сериализовать VSSItemaClass
PM   Вверх
Wanderer2019
Дата 12.1.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



using SourceSafeTypeLib;

Код

public class VSS
    {
        private ArrayList FilesList=null;
        public VSS()
        {
            FilesList=new ArrayList();
        }
        public void VssFindItem(VSSItem VssItem,string item)
        {
            VSSItem resItem; 
            IVSSItems col = VssItem.get_Items(false);
            SourceSafeTypeLib.IVSSVersions versions;
            foreach(VSSItem eachItem in col)
            {    
                versions=eachItem.get_Versions(0);
                foreach(VSSVersion vs in versions)
                {
                    if(eachItem.Type==1&&vs.Label==item)
                    {                        
                        resItem=vs.VSSItem.get_Version(vs.VersionNumber);
                        FilesList.Add(resItem);
                        continue;
                    }
                }
                if(eachItem.Type==0)
                {
                    VssFindItem(eachItem,item);
                }
            }
        }
    }

PM ICQ MSN   Вверх
Exception
Дата 12.1.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Напиши обертку для VSSItemClass с Serializable. И юзай ее в аррайлисте
PM   Вверх
Wanderer2019
Дата 12.1.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Обертку???
можно пример какой нить простенькой обертки smile
PM ICQ MSN   Вверх
Exception
Дата 12.1.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
class FuckingClass{
//несериализуемый
private int data;
public int Data{
get {return data;}
set {data=value;}
}
}
[Serializable()]
class CoolClass{
[NotSerializable()] private FuckingClass mydata;
public int MyData{
get{return mydata.Data;}
set{mydata.Data=value;}
}
}
и аналогично "обертываешь" каждый новый проперти.

Это сообщение отредактировал(а) Exception - 12.1.2006, 18:33
PM   Вверх
Wanderer2019
Дата 12.1.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а методы нужно как нибудь оборачивать???
PM ICQ MSN   Вверх
Exception
Дата 12.1.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не, зачем? Разве что ты их вызывать будешь
PM   Вверх
Wanderer2019
Дата 12.1.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну вот смотри я там метод VSSItem вызываю:
Код

versions=eachItem.get_Versions(0);


ну вот... в данном слчае get_Versions(int) каким то образом оборачивать не надо?

Exception
Спасибо за помощь!
PM ICQ MSN   Вверх
Exception
Дата 12.1.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не, не нужно. Суть в том, что вместо несериализуемых итемов сериализуется твой класс.
PM   Вверх
dronzo
Дата 12.1.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



М-да. Сейчас пока просматривал заметки, наткнулся на такую штуку, как ISerializationSurrogate (it provides you the ability to serialize a type that was not originally designed to be serialized). Сам только что наткнулся, так что вряд ли много смогу помочь, но сам вникаю. Посмотри в MSDN что и как , а я сейчас на коленке попробую накатать, так что не обессудь. Заодно и сам проверю, как понял smile
Код

// Оборачиваешь VSSItemClass и реализуешь в обёртке интерфейс ISerializationSurrogate
public class VSSItemClassSurrogate : ISerializationSurrogate {

       public VSSItemClassSurrogate() {
  
}
 
 public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) {
       VSSitemClass objVSSItemClass = (VSSItemClass) obj;
       // заполняешь  info методом AddValue
       info.AddValue(<строковый идентификатор>, <поле VSSItemClass>);
      // ...  и так по всем полям, что нужны
}
 
 
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) {
       VSSItemClass objVssItemClass = (VSSItemClass) obj;
       objVSSItemClass.<полее VSSItemClass> =  info. <соответствующий метод SerializationInfo>;
      // и так по всему, что сохранилось
      return(objVSSItemClass);
}
}

/* теперь переходим в метод, где будем сериализовать 
     предполагается, что VSSItemClass уже сформирован : vssItemClass
*/

       MemoryStream memoryStream = new MemoryStream();                 
       BinaryFormatter formatter = new BinaryFormatter();
       SurrogateSelector surrogateSelector = new SurrogateSelector();
       VSSItemClassSurrogate vssItemClasSurrogate = new VSSItemClassSurrogate();
       vssItemClassSurogate.AddSurrogate(typeof(VSSitemClass), new StreamingContext(StreamingContextStates.All),       vssItemClassSurrogate); 
 
        formatter.SurrogateSelector = surrogateSelector;
 
        // сериализуем
        formatter.Serialize(memoryStream, vssItemClass);
 
        memoryStream.Position = 0;

         // десериализуем
         VSSItemClass vssItemClassNew = (VSSItemClass)formatter.Deserialize(memoryStream);                           
}


PS Будет работать или нет - не знаю smile, но решение интересное.

Это сообщение отредактировал(а) dronzo - 12.1.2006, 22:55
PM MAIL   Вверх
Exception
Дата 12.1.2006, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Супер! +1
PM   Вверх
Wanderer2019
Дата 12.1.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот нашел простой пример по этому поводу:
http://www.codeproject.com/dotnet/Surrogat...rialization.asp

Всем спасибо!
Попробую поставить + =)
PM ICQ MSN   Вверх
Wanderer2019
Дата 13.1.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот что у меня в результате всего этого получилось.
Написал этот surrogate пока что хотя бы на одно поле (остальные там все все равно только read only так что не знаю как с ними быть).
имеем:
Код

    public class VSSItemClassSurrogate : ISerializationSurrogate
    {

        public VSSItemClassSurrogate()
        {
        }

        public void GetObjectData(object obj, SerializationInfo info, 
            StreamingContext context)
        {
            VSSItem item=obj as VSSItem;
            info.AddValue("Name", item.Name);
        }
        public object SetObjectData(object obj, SerializationInfo info, 
            StreamingContext context, ISurrogateSelector selector)
        {
                VSSItem item=obj as VSSItem;
                item.Name  = info.GetString("Name");

                return item;
        }
    }


в main-имеем:
Код

                       SurrogateSelector ss = new SurrogateSelector();
            VSSItemClassSurrogate vss=new VSSItemClassSurrogate();
            ss.AddSurrogate(typeof(VSSItemClass), 
                new StreamingContext(StreamingContextStates.All), vss);
            Stream myFileStream = File.Create(@"C:\test\test.bin");
            BinaryFormatter serializer = new BinaryFormatter();
            serializer.SurrogateSelector=ss;
            serializer.Serialize(myFileStream, myVss);
            myFileStream.Close();

это все отрабатывает без вопросов. в файл чего то там пишет.

а вот де-сеарелизация не работает =(
я пытаюсь так:
Код

            Stream mynFileStream = File.OpenRead(@"C:\test\test.bin");
            VSS newVss =(VSS) serializer.Deserialize(mynFileStream); //VSS описан выше
            mynFileStream.Close();


Говорит
COM object with CLSID {783CD4E3-9D54-11CF-B8EE-00608CC9A71F} is either not valid or not registered.

не понимаю что это такое? что он пытается найти по этому ключу????
PM ICQ MSN   Вверх
Exception
Дата 13.1.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Проверь правильность регистрации dll-ки.
Набери regsvr32.exe -путь к dll-
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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