O que acontece se serializarmos e desserializarmos dois objetos que fazem referência uns aos outros?

15

Para deixar isso 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 desserializamos a partir desse arquivo?

Eu pensei que nós temos 4 objetos, 2 de cada. Objetos idênticos, mas instâncias diferentes.

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

Se alguma tecnologia precisar responder, pense com base em Java.

Obrigado.

    
por Seregwethrin 31.05.2012 / 21:54
fonte

2 respostas

25

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

Assim, para o seu exemplo, se você escrever a instância "a" no fluxo, o fluxo fornecerá a esse objeto uma ID exclusiva (digamos "1"). Como parte da serialização de "a", você tem que serializar "b", e o fluxo dá a ele outro id ("2"). Se você escrever "b" no fluxo, a única coisa que está escrita é o ID, não o objeto real.

O fluxo de entrada faz o mesmo ao contrário: para cada objeto que lê do fluxo, ele 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 ele vê um objeto que foi serializado usando um ID, ele recupera a instância original do mapa.

É assim que os documentos da API o descrevem:

Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written

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

    
por 31.05.2012 / 22:11
fonte
2

Em Java, isso é resolvido colocando-se o cache dos objetos serializados e gravando o identificador quando ele é escrito novamente.

Veja o passo 5 no link .

    
por 31.05.2012 / 22:17
fonte