O que acontece se serializarmos e desserializarmos dois objetos que se referem um ao outro?

15

Para deixar mais claro, este é um exemplo rápido:

class A implements Serializable { public B b; }
class B implements Serializable { public A a; }
A a = new A();
B b = new B();
a.b = b;
b.a = a;

Então, o que acontece se serializarmos objetos aeb em um arquivo e desserializarmos desse arquivo?

Pensei que tivéssemos 4 objetos, 2 de cada. Objetos idênticos, mas instâncias diferentes.

Mas não tenho certeza se há mais alguma coisa ou se está certo ou errado.

Se alguma tecnologia for necessária para responder, pense em Java.

Obrigado.

Seregwethrin
fonte

Respostas:

25

Java monitora os objetos que foram gravados no fluxo e as instâncias subseqüentes são gravadas como um ID, não como um objeto serializado real.

Portanto, para o seu exemplo, se você escrever a instância "a" no fluxo, o fluxo fornecerá a esse objeto um ID exclusivo (digamos "1"). Como parte da serialização de "a", você precisa serializar "b", e o fluxo fornece outro ID ("2"). Se você escrever "b" no fluxo, a única coisa gravada é o ID, não o objeto real.

O fluxo de entrada faz a mesma coisa ao contrário: para cada objeto que lê do fluxo, atribui um número de ID usando o mesmo algoritmo que o fluxo de saída, e esse número de ID faz referência à instância do objeto em um mapa. Quando vê um objeto que foi serializado usando um ID, ele recupera a instância original do mapa.

É assim que os documentos da API a descrevem:

Várias referências a um único objeto são codificadas usando um mecanismo de compartilhamento de referência, para que os gráficos dos objetos possam ser restaurados com a mesma forma de quando o original foi gravado.

Esse comportamento pode causar problemas: como o fluxo contém uma referência rígida para cada objeto (para que ele saiba quando substituir o ID), você pode ficar sem memória se gravar muitos objetos transitórios no fluxo. Você resolve isso chamando reset().

parsifal
fonte
Então isso fará com que volte ao estado original após a desserialização, certo? Como é antes da serialização com referências uns aos outros?
Seregwethrin
1
Sim, você acaba com apenas 2 objetos, fazendo referência um ao outro.
Hectorct
1
Não acredito que o Java lida com isso automaticamente. Estou impressionado
Cruncher