Soquete / serialização Java, o object não será atualizado

Eu estou escrevendo um pequeno programa baseado em soquete. Eu estou usando uma class ModelEvent para passar informações através do soquete. dentro do ModelEvent, há uma variável obect do tipo (Object).

O object em si é um array 2D com alguns valores.

object[1][2] = 2; ModelEvent event = new ModelEvent("allo", object); dispatchEvent(event); object[2][3] = 2; ModelEvent event2 = new ModelEvent("you", object); dispatchEvent(event2); 

Digamos que o object da matriz esteja preenchido com o valor 1. O primeiro evento (evento) é recebido pelo cliente e os dados estão corretos. O segundo evento enviado embora os dados não estejam corretos. Seus dados são os mesmos do primeiro envio. o “allo” e “you” é para ver se eu não estou lendo o mesmo evento duas vezes e a resposta não é. A string está certa, mas o object não é, caso tenha sido atualizado. Eu percorrer o array antes de enviar o segundo evento para ver se ele está atualizado no lado do servidor, e é. Mas no lado do cliente, ainda permanece o mesmo que no primeiro envio, mesmo que o evento em si seja alterado.

Veja ObjectOutputStream.reset .

A reconfiguração desconsiderará o estado de qualquer object já gravado no stream. O estado é redefinido para ser o mesmo que um novo ObjectOutputStream . O ponto atual no stream é marcado como reset para que o ObjectInputStream correspondente seja redefinido no mesmo ponto. Objetos gravados anteriormente no stream não serão referenciados como já estão no stream. Eles serão gravados no stream novamente.

 /* prevent using back references */ output.reset(); output.writeObject(...); 

Chame o reset antes de escrever o mesmo object para garantir que seu estado atualizado seja serializado. Caso contrário, usará apenas uma referência de retorno ao object gravado anteriormente com seu estado desatualizado.

Ou, você poderia alternativamente usar ObjectOutputStream.writeUnshared como segue.

Grava um object “não compartilhado” no ObjectOutputStream . Esse método é idêntico ao writeObject , exceto pelo fato de sempre gravar o object fornecido como um object novo e exclusivo no stream (em oposição a uma referência anterior apontando para uma instância serializada anteriormente).

Especificamente:

  • Um object escrito via writeUnshared é sempre serializado da mesma maneira que um object recém-exibido (um object que ainda não foi gravado no stream), independentemente de o object ter sido gravado anteriormente ou não.

  • Se writeObject for usado para gravar um object que tenha sido gravado anteriormente com writeUnshared, a operação writeUnshared anterior será tratada como se fosse uma gravação de um object separado. Em outras palavras, o ObjectOutputStream nunca gerará back-references para dados de object gravados por chamadas para writeUnshared .

Embora a gravação de um object via writeUnshared não garanta uma referência exclusiva ao object quando ele é desserializado, ele permite que um único object seja definido várias vezes em um stream, de forma que várias chamadas para readUnshared pelo receptor não entrem em conflito. Observe que as regras descritas acima se aplicam apenas ao object de nível base escrito com writeUnshared e não a qualquer sub-object referenciado transitivamente no gráfico de object a ser serializado.

 output.writeUnshared(...); 

Note que é uma boa prática ObjectInputStream.readUnshared isso com ObjectInputStream.readUnshared .

Lê um object “não compartilhado” do ObjectInputStream . Esse método é idêntico ao readObject, exceto que ele impede que as chamadas subsequentes para readUnshared e readUnshared retornem referências adicionais para a instância desserializada obtida por meio dessa chamada.

Especificamente:

  • Se readUnshared for chamado para desserializar uma referência anterior (a representação de stream de um object que foi gravado anteriormente no stream), uma ObjectStreamException será lançada
  • Se readUnshared for readUnshared êxito, todas as tentativas subseqüentes de desserializar referências anteriores para o identificador de stream desserializado por readUnshared farão com que uma ObjectStreamException seja lançada.

readUnshared um object via readUnshared invalida o identificador de stream associado ao object retornado. Observe que isso por si só nem sempre garante que a referência retornada por readUnshared seja exclusiva; o object desserializado pode definir um método readResolve que retorna um object visível para outras partes, ou readUnshared pode retornar um object Class ou enum constante obtido em outro lugar no stream ou através de meios externos. Se o object desserializado define um método readResolve e a invocação desse método retorna uma matriz, então readUnshared retorna um clone superficial dessa matriz; isso garante que o object array retornado seja exclusivo e não possa ser obtido uma segunda vez a partir de uma invocação de readObject ou readUnshared no ObjectInputStream , mesmo se o stream de dados subjacente tiver sido manipulado.

 obj = input.readUnshared(); 

Eu não vejo o código dispatchEvent, mas pelo que você escreveu, eu assumo o seguinte: você escreve o mesmo object (somente seu estado é alterado), isso significa que ele irá escrever apenas a referência duas vezes. você pode ver em documentos de stream de saída java (para desempenho).

você deve usar writeUnshared (), que irá criar um novo object em cada gravação

Eu vejo reset foi sugerido, isso vai te para o mesmo resultado, mas tem impacto no desempenho.