DCOM тут вообще не при делах. Это механизм объектно-ориентированного RPC через сеть.
В COM предусмотрен ряд интерфейсов, через который внешний пользователь может попросить объект
- Сохранить своё состояние в виде потока байтов
- Загрузить из потока байтов своё состояние
Это интерфейсы
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 — это объекто-ориентированный интерфейс в потоку байтов. Естественно, что передать по сети поток байт можно
любой.