Модераторы: 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   Вверх
Wanderer2019
Дата 13.1.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а зачем ему вообще нужна эта dll-ка??? я так понимаю что он пытается добраться до той самой с VSSLib ddl-ки... но зачем??? я же подсоединил ее к нему через refference.
PM ICQ MSN   Вверх
Exception
Дата 13.1.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Wanderer2019 @ 13.1.2006, 16:20 Найти цитируемый пост)

я же подсоединил ее к нему через refference

Попробуй все-таки отрегить ее и опять зарегить. Помогает
PM   Вверх
mr.DUDA
Дата 13.1.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Wanderer2019 @ 13.1.2006, 14:20 Найти цитируемый пост)
а зачем ему вообще нужна эта dll-ка??? я так понимаю что он пытается добраться до той самой с VSSLib ddl-ки... но зачем??? я же подсоединил ее к нему через refference.

Может, есть сериализуемое свойство, в коде которого ты обращаешься к классам/функциям из этой dll ? Или сериализуемое поле с типом из этой dll ? Над такими свойствами и пропертями надо поставить атрибут NonSerializable


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


Опытный
**


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

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



В случае если я сеарелизую объект моего класса с пустым ArrayList`ом то все работает... и десеарелизуется... а когда там чего то есть то не пашет...

mr.DUDA
это всмысле как?? предположим в моем классе есть некоторые свойства и объекты классов
входяящих в эту длл-ку... т.е. если я не хочу их сеарилизовать.. а мне нужен только один объект (для которого я и писал surrogate) то перед остальными нужно ставить NonSerializable...
Добавлено @ 16:21
вообщем не знаю уже куда двигаться... простые примеры пробовал.. все работает... это не хочет:
Код

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;
        }
    }
    
[Serializable]
    public class VSS
    {
        public ArrayList FilesList=null;
        [NonSerialized()]
            private IVSSItems col=null;
        [NonSerialized()]
            private IVSSVersions versions=null;
//чего еще сюда писать не знаю
        public VSS()
        {
            FilesList=new ArrayList();
        }
        public void VssFindItem(VSSItem VssItem,string item)
        {
            VSSItem resItem;
            col = VssItem.get_Items(false);
            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);
                }
            }
        }
    }


в main идет слудующее:
Код

string password="";
SourceSafeTypeLib.VSSDatabaseClass data=new VSSDatabaseClass();
            data.Open(@"c:\\Program Files\\Microsoft Visual Studio\\VSS\\srcsafe.ini",Environment.UserName,password);
            SourceSafeTypeLib.VSSItem item=data.get_VSSItem("$/",false);
VSS myVss=new VSS();//его и нужно serialize в файл
            myVss.VssFindItem(item,"007");//отбирает объекты VSS по метке
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);//выдает ошибку
            mynFileStream.Close();


smile smile smile

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


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


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

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



Wanderer2019
Вот честно скажи, зачем тебе сериализовать объект, взятый из type-library, тем более связанный с SourceSafe? Ведь после того, как ты его сохранишь, а через неделю восстановишь, состояние VSS уже давно изменится и объект будет неактуальным. Или VSS-сервер выключат. И зачем тогда было его сериализовать?

Поэтому сядь спокойно и подумай, чего ты хочешь добиться. А для систематизации своих мыслей можно все изложить письменно и запостить сюда smile


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


Опытный
**


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

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



При сохранении объекта VSSItem сохранится и его версия... а следовательно ее можно будет взять из VSS (который хранит много версий одного и того же файла) не зависимо от того изменилось ли состояние VSS или нет.. просто добавятся новые версии... а интересующая меня версия останется. Таким образом преджполагалось иметь файлы с информацией о взятых из VSS модулях (полная информация). Ну предположим да... возможно просто описать свой класс... аналогичный VSSItem и сериализовать его. Но тогда теряется весь смысл. А именно просто имея ArrayList с объектами VSSItem вытащить интересующий меня из VSS =(. Таким образом хотел иметь архив файлов взятых из VSS для использования в соответствующем дестрибутиве.
PM ICQ MSN   Вверх
arilou
Дата 13.1.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Wanderer2019 @ 13.1.2006, 16:43 Найти цитируемый пост)

А именно просто имея ArrayList с объектами VSSItem вытащить интересующий меня из VSS

Как вариант - вместо ArrayList с объектами VSSItem иметь ArrayList с твоими объектами VSSItemProxy, которые при первом обращении к любому своему свойству заново инициализируют внутри себя помеченный как [NonSerializable] VSSItem.

VSSItemProxy - это получится гибрид прокси с объектом-призраком (Мартин Фаулер рулит smile ) - virtual ghost proxy object smile


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

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


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

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


 




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


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

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