LINUX.ORG.RU

Преобразование сложного объекта в байтовый поток


0

0

Есть некоторый сложный объект A:

         R
        / \
       /   \
      /     \
     /       \
    A ======> C
   / \
  /   \
 B1   B2

B1 и B2 - объекты, содержащиеся в A. A ссылается на объект C 
(например таким образом задан класс объекта A). 
В данном случае все объекты имеют общий корень R.

Задача: перевести объект A в вид, пригодный для отправки в байтовый
поток, короче говоря, перевести его в строку символов.

Решение, которое напрашивается - рекусрвисно перебрать все объекты
A и составить из них таблицу, присвоив каждому элементу индекс, затем
описать связи, как ориентированные пары индексов.

Однако, при этом появляется проблема: а как записать ссылку
на внешний объект (в данном случае C)? Записывать еще и объект
C нельзя, так как он не является составной частью A.
Записать путь к C тоже не всегда возможно - вдруг объекты A
и С не будут иметь общего корня R.

Как эта проблема решена в различных языках программирования и
какое решение лучше выбрать?

Спасибо.
★★★

С самими объектами всё просто - делаеш в R виртуальный метод serialize который отправляет в поток все поля объекта, и метод (конструктор?) deserialize, который их в том же порядке считывает. В наследниках дорисовываеш этот метод так, чтобы он вызывал таковой метод родителя, и затем поступал аналогично со своими полями.

Если ты уверен что указатель на данный объект С есть только в одном из классов, т.е. В разных А не может быть ссылки на один и тот же С, можно считать С как часть А и поступать аналогично. Иначе заморачиваешся: в С делаеш статический метод getinstance (id), где id - значение указателя или какая-нибудь величина, однозначно соответствующая указателю, например этот же указатель в строковом виде. Он нужен только для того, чтобы однозначно определить объект. При сериализации накапливаеш значения сериализованных id, с целью не допустить сериализацию одного и того же С более одного раза. При считывании создаёш все С и таблицу их idов. По id из статического метода возвращается вновь созданный объект с таким id.

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

Т.е. ты предлагаешь свести проблему разрешения ссылок к работе с CLSID? А есть ли у этого способа недостатки?

kmeaw ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.