Í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:
- 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)
- 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 [].
- 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 inputstreamMemó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.