Serializando objetos mutantes

5

Em nosso sistema, um arquivo de mídia pode ter vários estados:

  • inválido
  • vazio
  • fazendo upload
  • ingerindo
  • pronto…

.. dependendo do estado, as informações sobre a mídia são acessadas de maneiras diferentes. Por exemplo:

  • Durante o upload, o nome do arquivo está em um arquivo JSON de informações de upload temporário no sistema de arquivos.
  • Quando o objeto estiver pronto, esse nome de arquivo será adivinhado, observando-se um local específico no sistema de arquivos (ou seja, sob um diretório nomeado após o ID da mídia).

O mesmo vale para o atributo "progresso" de uma mídia:

  • Durante o upload, "progresso" representa o tamanho dos bytes / arquivos baixados.
  • Durante a etapa de processamento, o progresso representa as etapas do número da etapa atual / número total (miniaturas, pós-processamento, etc.).

O estado serializado de uma mídia é usado pela interface do usuário para alimentar as informações de volta ao usuário.

Um MediumStateFactory tenta várias classes AbstractMediumState derivadas ( MediumStateReady , MediumStateUploading , etc) até que uma pessoa se qualifique para lidar com o estado atual da mídia.

Acontece que para arquivos minúsculos o estado pode mudar durante a serialização: um MediumStateUploading pode ser construído no início da serialização, mas como o estado da mídia muda, no momento em que a serialização real é feita, não t representa mais a mídia, levando a erros. Por exemplo, um MediumStateUploading espera recuperar o tamanho da mídia do JSON temporário.

Atualmente, estamos reiniciando a serialização inteiramente se detectarmos uma exceção durante o processo. Isso é bastante força bruta e bastante feia.

Qual seria a melhor maneira de serializar objetos que podem sofrer mutação durante o processo de serialização?

    
por Charles 16.05.2016 / 13:33
fonte

4 respostas

2

Eu percebo que sua pergunta é especificamente sobre serialização, mas acho que você pode estar tentando resolver o problema errado aqui. Eu sugiro que você pense se você tem preocupações separadas corretamente no design do aplicativo. Pode fazer mais sentido considerar o estado serializado de um arquivo de mídia como uma composição de algum ID exclusivo e algumas informações de estado possivelmente desatualizadas, e usar o último apenas para informações do usuário. Em seguida, você pode delegar a escrituração contábil real com base nas identificações exclusivas de uma entidade que não precisa depender das informações de estado possivelmente desatualizadas que retornam da interface do usuário.

    
por 02.06.2016 / 13:53
fonte
2

Esse é o problema com objetos mutáveis, que eles podem sofrer mutações.

Obviamente, se você conseguiu serializar corretamente o estado que seu objeto tem agora, não será o estado que seu objeto terá daqui a dois segundos. Portanto, ter o estado serializado não compatível com o estado atual deve ser aceitável, caso contrário você terá perdido.

Se as alterações em seu objeto forem independentes e for aceitável serializar seu objeto com qualquer conjunto de alterações completas (por exemplo, o conjunto de arquivos permanece inalterado, mas o estado de cada arquivo pode mudar), o mais fácil seria ser para ter um bloqueio para cada descrição de arquivo, e você olha uma descrição de arquivo em torno de sua serialização e em torno de modificações.

Se você tiver encadeamento adequado, poderá despachar a serialização e as modificações de objeto para o mesmo encadeamento serial, o que tornaria o bloqueio desnecessário.

    
por 02.06.2016 / 18:38
fonte
2

Escreve e lê separadamente. Abaixo está uma maneira de permitir que ambos ocorram ao mesmo tempo no mesmo arquivo.

Talvez você precise escrever ou alterar o estado da mídia. Tem uma lista de escritores e uma lista paralela de estados. Se a gravação falhar porque viola uma invaraint, mude o estado. Ele notificaria a lista de observadores com o estado.

A fábrica de médio porte é um osberver. Tem um cache do estado mais recente. Existe uma matriz paralela de fábricas de estado e abstratas. Se o estado mais recente não for alterado, desconhecido, remova o método original. Caso contrário, encontre o índice nas matrizes e use essa fábrica abstrata.

    
por 18.05.2016 / 16:16
fonte
0

É possível e viável dividir os dados serializados em partes? Uma parte contendo a parte estável do estado e uma pequena parte contendo a parte variável do estado.

Dessa forma, você tem várias opções:

  • você pode serializar a pequena parte de alteração por último;
  • você pode usar eventos, padrão de observação ou paradigma reativo para serializar a parte de alteração do estado quando ocorre uma alteração;
  • se a serialização for para persistência, você poderá omitir a parte em mudança ou anexá-la a um log de transação sequencial; ou,
  • você pode reiniciar a serialização apenas da parte que está mudando, exatamente como você faz agora.
por 16.05.2016 / 22:10
fonte