Pessoal, haveria como eu pegar um array de bytes contendo o objeto e depois reconstruí-lo? Grato.
Bytes de um objeto
5 Respostas
O nome para isso é “Serialização” e normalmente você pode usar algo como ObjectOutputStream e ByteArrayOutputStream (para construir o byte array), e ByteArrayInputStream e ObjectInputStream (para reconstituir o objeto.)
Note que a serialização não precisa guardar uma cópia fiel do objeto, apenas a informação necessária para reconstituí-lo. Por exemplo, strings não são serializadas como Unicode (2 bytes/caracter) mas como UTF-8 (em média 1 byte por caracter, mas caracteres acentuados podem ocupar 2 bytes, ideogramas ocupar 3 bytes e assim por diante.)
Isso funcionaria para objetos que não são salvos em um arquivo? Eu quero pegar os bytes de um objeto que eh atributo de uma classe, seria possível fazê-lo?
Dando um exemplo bastante boboca. Copie estas linhas para Test207.java e compile.
import java.io.*;
class Client implements Serializable {
private String name;
private String address;
public String getName() { return name; }
public String getAddress() { return address; }
public void setName(String name) { this.name = name; }
public void setAddress(String address) { this.address = address; }
public String toString() { return "name='" + name + "' and address= " + address + "'"; }
}
public class Test207 {
public static void main(String[] args) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream (baos);
Client myClient = new Client();
myClient.setName("Steve Jobs");
myClient.setAddress("1 Infinite Loop; Cupertino, CA 95014");
oos.writeObject (myClient);
oos.close();
byte[] serializedObject = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(serializedObject);
ObjectInputStream ois = new ObjectInputStream (bais);
Client yourClient = (Client) ois.readObject();
System.out.println (yourClient);
}
}
Ele deve imprimir
name='Steve Jobs' and address= 1 Infinite Loop; Cupertino, CA 95014'
Se você pegar o array do programa anterior, jogar um arquivo e olhar o
dump hexadecimal, vai ver como o objeto foi serializado.
0000 AC ED 00 05 73 72 00 06 43 6C 69 65 6E 74 F1 D7 .φ..sr..Client..
0010 74 76 C4 64 FD 43 02 00 02 4C 00 07 61 64 64 72 tv.d²C...L..addr
0020 65 73 73 74 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 esst..Ljava/lang
0030 2F 53 74 72 69 6E 67 3B 4C 00 04 6E 61 6D 65 71 /String;L..nameq
0040 00 7E 00 01 78 70 74 00 24 31 20 49 6E 66 69 6E .~..xpt.$1 Infin
0050 69 74 65 20 4C 6F 6F 70 3B 20 43 75 70 65 72 74 ite Loop; Cupert
0060 69 6E 6F 2C 20 43 41 20 39 35 30 31 34 74 00 0A ino, CA 95014t..
0070 53 74 65 76 65 20 4A 6F 62 73 Steve Jobs
mto obrigado