Implementar serialização e desserialização de objetos e dados binários com base em ObjectOutputStream

Índice

Por que precisamos serializá-lo?

Como implementar a serialização e desserialização de objetos e dados binários?


Por que precisamos serializá-lo?


Principalmente para converter um objeto (dados estruturados) em uma matriz de string/byte para facilitar nosso armazenamento (às vezes precisamos armazenar dados em um arquivo, e os arquivos só podem armazenar dados de string/binários, o que é inconveniente para armazenar objetos diretamente) e transmitir dados (transmiti-los pela rede).

Como implementar a serialização e desserialização de objetos e dados binários?


Na verdade, existem muitas soluções para serialização binária:

1. A biblioteca padrão Java fornece soluções de serialização, ObjectInputStream e ObjectOutputStream (recomendado).

2. Hessiano.

3. protobuffer

4. economia.

5. JSON também pode ser usado para representar dados binários por meio de algumas conversões (existem muitos símbolos especiais no formato JSON: "{} Esses símbolos afetarão a análise do formato JSON): os dados binários podem ser codificados em base64. A função de base64 é usar 4 bytes Representar informações de 3 bytes garantirá que todos os 4 bytes usem caracteres de texto (equivalente à conversão de dados binários em texto. Assim como incorporar uma imagem em HTML, a codificação binária base64 da imagem pode ser codificada diretamente como texto. O form está incorporado em HTML), mas a solução base64 é ineficiente, tem sobrecarga de transcodificação adicional e também aumentará o espaço.

Ps: Aqui utilizamos a solução um, que é a solução que vem com a biblioteca padrão, a maior vantagem desta solução é que não há necessidade de introdução de dependências adicionais.

A implementação específica é a seguinte:

  1. Primeiro de tudo, se você deseja que este objeto seja serializável ou desserializado, você precisa desta classe para implementar a interface Serializable (sem reescrever nenhum método)
  2. ByteArrayOutputStream: serializa o objeto em uma matriz de bytes. O objeto de fluxo é equivalente a uma matriz de bytes de comprimento variável. Os dados são serializados por meio do objeto e, em seguida, gradualmente gravados no ByteArrayOutputStream e, em seguida, convertidos uniformemente em byte [].
  3. ByteArrayInputStream: desserialize a matriz de bytes em um objeto, entregue os dados binários que precisam ser convertidos em byteArrayInputStream e, em seguida, entregue byteArrayInputStream em ObjectInputStream e, em seguida, use o método readObject para desserializá-los em um objeto.
public class BinaryTool {

    /**
     * 把一个对象序列化成一个字节数组
     * @param object
     * @return
     */
    public static byte[] toBytes(Object object) throws IOException {
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                //此处 writeObject 就会把该对象进行序列化,生成的二进制字节数据,写入到 ObjectOutputStream 中
                //又由于 ObjectOutputStream 又关联到了 ByteArrayOutputStream,最终就写入到了 ByteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            return byteArrayOutputStream.toByteArray();
        }
    }

    /**
     * 把一个字节数组反序列化成对象
     * @param data
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                //此处的 readObject 就是从 data 这个 byte 中读取数据并进行反序列化
                object = objectInputStream.readObject();
            }
        }
        return object;
    }

}

Ps: Não confunda os conceitos de entrada e saída

Tanto inputstream quanto  outputstream  são definições de streams. O centro dessas duas operações é a memória, portanto, para entender suas diferenças, a chave é entender a troca de memória e outros contêineres.

Memória -------------》Screen outputstreamScreen
-------------》Memory inputstream

Memória-------------》O outoutstream do disco rígido é seguido pela operação de gravação. Write grava o conteúdo no arquivo do disco rígido.
O disco rígido----------- --》O fluxo de entrada da memória é seguido pela operação de leitura. read lê o conteúdo do disco rígido para a memória e depois opera nele.
 

Acho que você gosta

Origin blog.csdn.net/CYK_byte/article/details/132265020
Recomendado
Clasificación