Есть некоторый сложный объект 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.