Capturar os bytes de uma classe?

6 respostas
cleberRS

Pessoal preciso capturar os bytes de uma classe, mas não desejo gerar um aquivo para isto, sendo assim qual as minhas opções?

Ex: Criei uma classe CryptoTest como faço para capturar os bytes dela sem ter que serielizala?

Alguém me disse que eu teria que extender a InputStream, ai aparece outra dúvida como implementar o método abstrato read()?

Desde já valeu a forçaaaaaaaaaaa.

6 Respostas

T

Você quer os dados de um objeto dessa classe, ou você quer os bytecodes (programa executável) da classe?

Se for o primeiro caso, basta serializar o objeto encapsulando um ObjectOutputStream em um ByteArrayOutputStream.

Se for o segundo caso, procure por ASM.

cleberRS

Thiagol,

sim quero capturar os bytes do Objeto que eu estanciar, mas não serializando ele! Se eu não me engano se eu serializar ele e encapsular em um ObjectOutputStream vou gerar um arquivo (o que preciso evitar)!

O intuíto é qual quero transmitir uma classe simples para um celular por ex: ImageEvent, nesta classe só pode conter recusrsos simples pois J2ME não aceita serialização!!!

Por isto preciso capturar os bytes do objeto sem serializar!!

T

Ah, entendi. JavaME não tem esse conceito; você provavelmente vai ter de fazer as coisas “no braço”, usando ByteArrayOutputStream / ByteArrayInputStream e DataInputStream / DataOutputStream. Vou dar mais ou menos um exemplo.

class Pessoa {
public String nome; public int idade;
}

class Exemplo {
    byte[] codificaPessoa (Pessoa p) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream (baos);
        dos.writeUTF (p.nome); dos.writeInt (idade);
        dos.close();
        return baos.toByteArray();
    }
    Pessoa decodificaPessoa (byte[] bytes) throws Exception {
        ByteArrayInputStream bais = new ByteArrayInputStream (bytes);
        DataInputStream dis = new DataInputStream (bais);
        Pessoa p = new Pessoa();
        p.nome = dis.readUTF(); p.idade = dis.readInt();
        dis.close();
        return p;
    }
}
T

Vou mover isto para “Java Micro Edition”, para que evitem dar sugestões que não funcionam em JavaME.

cleberRS

thingol,

cara acho que é por ai, agora digamos que minha classe contenha os seguintes atributos.

public class ImageTest

{

private byte[]image;

private long date;

private int  precision;
public ImageTest decodificar(byte[] byte)

{

ByteArrayInputStream in = new ByteArrayInputStream(byte);

DataInputStream input = new DataInputStream(in);
long date = input.readLong();
  int precision = imput.readInt();
  byte[] date = ? [b]// como eu faria apartir do array de bytes recebido por parâmetro, buscar o array de bytes da imagem?[/b]
  
  return new ImageTest(image, date, precision);

}

}

A
// um int tem 32 bits (4 bytes)

// um long tem 64 bits (8 bytes)

byte[] image = new byte[bytes.length - 4 - 8];

input.read(image);
Criado 18 de março de 2009
Ultima resposta 18 de mar. de 2009
Respostas 6
Participantes 3