Передача объектов по-сети

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Передача объектов по-сети

Сообщение jangle » 28.05.2018 (Пн) 14:57

В C# я сериализую объекты в JSON формат и передаю их в пакетах TCP. А на клиенте десериализую JSON обратно в объекты.
Как передавать объекты в VB6 ?

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Передача объектов по-сети

Сообщение The trick » 28.05.2018 (Пн) 21:33

Передать состояние объекта?
Если это, то DCOM и через PropertyBag передать состояние (класс соответственно должен быть Persistable).
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Передача объектов по-сети

Сообщение jangle » 29.05.2018 (Вт) 11:17

Хех, я про PropertyBag я и забыл совсем.. А он точно сможет передаваться по-сети?

DCOM вроде запретили использовать на современных версиях винды, потому как слишком небезопасный

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передача объектов по-сети

Сообщение Хакер » 29.05.2018 (Вт) 15:09

DCOM тут вообще не при делах. Это механизм объектно-ориентированного RPC через сеть.

В COM предусмотрен ряд интерфейсов, через который внешний пользователь может попросить объект
  1. Сохранить своё состояние в виде потока байтов
  2. Загрузить из потока байтов своё состояние

Это интерфейсы IPersistStream, IPersistStreamInit и др.

Как именно эти интерфейсы будут реализованы, в каком формате объект должен сохранять своё внутреннее состояние — технология COM не уточняет и оставляет это на совести того, кто реализовал объект. И вообще, этот интерфейс не обязателен, и будет ли объект объект поддерживать выгрузку/загрузку из потока — на совести того, кто реализовал объект.

С одной стороны, ты, jangle, можешь у своих объектов сам реализовать такой интерфейс и в реализации сделать сериализацию в любой мыслимый формат, в том числе и в JSON.

С другой стороны, если сделать как сказал The trick, то есть включить Persistable=Persistable, то у объекта появляется встроенная (обеспечиваемая силами VB) поддержка интерфейса IPersistStream. Естественно, не в JSON, а в бинарный формат. Но чтобы свойство Persistable вообще появилось, класс должен принадлежать проекту, который предполагает публичную TLB (то есть ActiveX EXE, ActiveX DLL). И в этом случае ты сам можешь подсунуть у любого нужного объекта запросить IPersistStream и заставить объект сохраниться в стрим. Целую кучу объектов можно заставить сохраниться в стрим (в нужном порядке), и этот поток байтов скинуть по сети.

В свете вышесказанного вопрос про PropertyBag выглядит глупо. Хотя действительно, в PropertyBag можно добавить keypair из свойства и значения, где значением будет объект, и в этом случае у объекта реализация PropertyBag запросит IPersistStream, вызовет у этого интерфейса метод Save подсунув свою реализацию IStream, а затем через свойство Contents можно прочитать то, что было записано в IStream. Только можно сдеать всё это без PropertyBag. Если свойство Persistable не установлено, то и PropertyBag обломается (равно как и самостоятельный запрос IPersistStream). Но если реализовать IPersistStream в классе самому (Implements IPersistStream и т.д.), то не обломается ни самостоятельный запрос IPersistStream, ни PropertyBag).

IStream — это объекто-ориентированный интерфейс в потоку байтов. Естественно, что передать по сети поток байт можно любой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Передача объектов по-сети

Сообщение The trick » 29.05.2018 (Вт) 18:49

Хакер писал(а):DCOM тут вообще не при делах. Это механизм объектно-ориентированного RPC через сеть.

В смысле, не при делах?
Как раз через DCOM можно создать удаленно объект, и передать ему состояние. Из VB это будет выглядеть также как и работа с локальным объектом.
UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передача объектов по-сети

Сообщение Хакер » 29.05.2018 (Вт) 19:07

Создать удалённо объект, а не создать копию объекта по сериализованному представлению.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Передача объектов по-сети

Сообщение The trick » 29.05.2018 (Вт) 19:20

Хакер писал(а):Создать удалённо объект, а не создать копию объекта по сериализованному представлению.

А что мешает сделать так Set pObject = PropBag.ReadProperty("...")? Здесь создание и инициализация.
Т.е. мы на локальной машине создаем удаленный объект и инициализируем его состояние из локального PropertyBag'а. Посредством DCOM это все делается одной строчкой.
UA6527P

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Передача объектов по-сети

Сообщение jangle » 30.05.2018 (Ср) 10:18

Так DCOM приложения можно использовать в Win10 или нет?

А то пишут что куча проблем: http://forum.cta.ru/forum_posts.asp?TID=5040

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передача объектов по-сети

Сообщение Хакер » 30.05.2018 (Ср) 12:05

jangle, нужно ещё раз повторить, что DCOM тут вообще не причём?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Передача объектов по-сети

Сообщение jangle » 02.07.2018 (Пн) 21:00

Хакер писал(а): Но если реализовать IPersistStream в классе самому (Implements IPersistStream и т.д.), то не обломается ни самостоятельный запрос IPersistStream, ни PropertyBag).


А можно пример реализации такого класса?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Передача объектов по-сети

Сообщение Хакер » 02.07.2018 (Пн) 22:41

jangle писал(а):А можно пример реализации такого класса?

Если взять пустой класс, и реализовать в нём IPersistStream, то такой реализации будет нечего сохранять/загружать.

Если в класс добавить 1 какое-то фиктивное свойство, которое мы будем загружать, то такой пример будет ненаглядным, потому что любой непосвящённый человек (а только такому примеры и нужны) скажет: «зачем нужно столько мороки ради одного поля»? Потому что сохранение одного поля (свойства) будет выглядеть смешно на фоне тонны кода, который построен вокруг сохранения/загрузки этого поля по правилам IPersistStream.

Вывод: нужно писать пример, где классы были бы не фиктивными (а-ля класс «CFoo» с бессмысленной переменной «Bar»), а осмысленными, функциональными, а сам пример должен покрывать случай сериализации/десериализации гетерогенного набора объектов. А это немаленький объём работы.

Может и сделаю.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Передача объектов по-сети

Сообщение Vova_2581 » 03.07.2018 (Вт) 9:47

Хакер писал(а):Может и сделаю.

Зачем Вы снова обещаете "жениться", не понимаю??? :cry:
Мы ведь все помним 1
Мы ведь все помним 2

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Передача объектов по-сети

Сообщение The trick » 03.07.2018 (Вт) 10:59

jangle, в чем возникли проблемы при использовании метода который я привел?
Создаешь ActiveX EXE, с нужным классом (классами) с Persistable=true. Регистрируешь на целевой машине и на удаленной. В VB6 создаешь и инициализируешь объект через PropertyBag, передача состояния по сети/запроса/ответа/ожидания будет осуществлена автоматически средствами Windows. То что советует Хакер - тоже самое только имплементацией Persist-интерфейсов/передачей по сети/ожиданием должен заниматься ты в обмен на возможность использования непубличных классов. Если тебя не смущает это, то делай так. Насчет новых систем, не думаю что там запрещено, просто правильно нужно сконфигурировать. Попробуй на простом проекте, типа такого:
https://support.microsoft.com/en-us/hel ... sual-basic
UA6527P


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

    TopList