Porque com.db4o.ext.ObjectNotStorableException?

6 respostas
cleiton_herrmann

Olá pessoal...

Não sei se aqui é o lugar certo pra pedir ajuda sobre db4o, além do próprio forum no site oficial do db4o, mas eu ja nao sei a quem pedir ajuda entao resolvi criar um tópico aqui, quem sabe nao aparece alguem que me ajude...

Estou tendo problemas ao tentar salvar um objeto, estou trabalhando com db4o + java, no modo cliente / servidor.

Pelo que eu pesquisei e entendi, vi que o db4o antes de salvar um objeto, tenta instanciar o mesmo, e se conseguir ele salva, caso contrario nao, e lança a excessão ( com.db4o.ext.ObjectNotStorableException ), outra coisa q vi, foi que o db4o possui tipos de dados que ele nao consegue salvar, mas eu nao consegui descobrir quais são...

Através de testes que eu fiz, eu descobri que o problema está no tipo de dado BufferedImage que estou usando para salvar uma imagem, pois quando deixo este atributo do objeto em comentario no código, o objeto é salvado normalmente pelo db4o...

Obs: Eu tenho um outro projeto que está acontecendo a mesma coisa, ao tentar salvar o objeto com o atributo BufferedImage, o db4o nao salva e lança a excessao, porém em um projetinho teste que fiz antes, eu consegui salvar sem nenhum problema o mesmo objeto que tento salvar no projeto verdadeiro, e a única diferença entre os projetos, é a quantidade de classes, e que o objeto a ser salvo está em um package separado, mas eu ja coloquei no mesmo pacote e tbem não funcionou, simplesmente nao sei mais o q pensar pra resolver esse problema...

Alguém sabe como resolver este problema ??? Abaixo segue o código do objeto que estou tentando salvar, é simplesmente um bean com métodos set e get.
import java.awt.image.BufferedImage;
import java.io.File;

/**
 *
 * @author Cleiton
 */
public class PROPRIEDADES_ETIQUETA {
    private String nomeArquivo;
    private float larguraPag;
    private float alturapag;
    private float larguraEt;
    private float alturaEt;
    private float margemEsq;
    private float margemDir;
    private float margemSup;
    private float margemInf;
    private float distColunas;
    private float distLinhas;
    private int qtdeColunas;
    private int qtdeLinhas;
    private int tipoPapel;
    private int unidadeMedia;
    private BufferedImage etiqueta;
    private File pdf;

    public String getNomeArquivo() {
        return nomeArquivo;
    }

    public void setNomeArquivo(String nomeArquivo) {
        this.nomeArquivo = nomeArquivo;
    }
   
    public float getLarguraPag() {
        return larguraPag;
    }

    public void setLarguraPag(float larguraPag) {
        this.larguraPag = larguraPag;
    }

    public float getAlturapag() {
        return alturapag;
    }

    public void setAlturapag(float alturapag) {
        this.alturapag = alturapag;
    }

    public float getLarguraEt() {
        return larguraEt;
    }

    public void setLarguraEt(float larguraEt) {
        this.larguraEt = larguraEt;
    }

    public float getAlturaEt() {
        return alturaEt;
    }

    public void setAlturaEt(float alturaEt) {
        this.alturaEt = alturaEt;
    }

    public float getMargemEsq() {
        return margemEsq;
    }

    public void setMargemEsq(float margemEsq) {
        this.margemEsq = margemEsq;
    }

    public float getMargemDir() {
        return margemDir;
    }

    public void setMargemDir(float margemDir) {
        this.margemDir = margemDir;
    }

    public float getMargemSup() {
        return margemSup;
    }

    public void setMargemSup(float margemSup) {
        this.margemSup = margemSup;
    }

    public float getMargemInf() {
        return margemInf;
    }

    public void setMargemInf(float margemInf) {
        this.margemInf = margemInf;
    }

    public float getDistColunas() {
        return distColunas;
    }

    public void setDistColunas(float distColunas) {
        this.distColunas = distColunas;
    }

    public float getDistLinhas() {
        return distLinhas;
    }

    public void setDistLinhas(float distLinhas) {
        this.distLinhas = distLinhas;
    }

    public int getQtdeColunas() {
        return qtdeColunas;
    }

    public void setQtdeColunas(int qtdeColunas) {
        this.qtdeColunas = qtdeColunas;
    }

    public int getQtdeLinhas() {
        return qtdeLinhas;
    }

    public void setQtdeLinhas(int qtdeLinhas) {
        this.qtdeLinhas = qtdeLinhas;
    }

    public int getTipoPapel() {
        return tipoPapel;
    }

    public void setTipoPapel(int tipoPapel) {
        this.tipoPapel = tipoPapel;
    }

    public int getUnidadeMedia() {
        return unidadeMedia;
    }

    public void setUnidadeMedia(int unidadeMedia) {
        this.unidadeMedia = unidadeMedia;
    }

    public BufferedImage getEtiqueta() {
        return etiqueta;
    }

    public void setEtiqueta(BufferedImage etiqueta) {
        this.etiqueta = etiqueta;
    }

    public File getPdf() {
        return pdf;
    }

    public void setPdf(File pdf) {
        this.pdf = pdf;
    }
   
    @Override
    public String toString() {
        return this.nomeArquivo;
    }

}

6 Respostas

V

vc ta tentando salva isso?

private BufferedImage etiqueta;  
  private File pdf;

acho q deve ser isso pelo erro

ObjectNotStorableException

vc tem como mudar d banco? talvez possa ajudar

cleiton_herrmann

Olá vijava…

é isso mesmo, estou tentando salvar este objeto que contém o bufferedImage, que por sua vez guarda uma imagem…
mas eu nao entendi o que vc quiz dizer com

acho q deve ser isso pelo erro

isso o q? e mudar de banco por que? pra qual por exemplo?

mais pra falar a verdade nao pretendo sair do db4o, ja tem bastante coisa feita…

vlw a resposta rapida ai !!! t+

Mauricio_Linhares

Você não pode mandar um File ou um BufferedImage pra o DB4O, transforme isso em um array de bytes no seu bean e seja feliz.

cleiton_herrmann

Olá Maurício Linhares, td blz?

entao cara, eu ja tinha pensado nisso, inclusive agora eu desisti de vez de fazer o treco funcionar com bufferedImage e fiz um array de bytes mesmo, mais se eu te falar que antes de implementar no projeto verdadeiro eu fiz um projetinho teste só pra ver comeh q ia funcionar, e nesse projetinho teste tah gravando, alterando, excluindo e consultando normalmente o mesmo javaBean, com os atributos BufferedImage e File, por isso que eu to de cara tentando fazer funcionar, mas hj com o seu conselho, resolvi largar pros ursos e "ser feliz" huahaiuha, fiz um byte array aqui, só que to meio encucado aqui com um negocio, eu to ha duas horas pesquisando jah e nao achei nd, eu fiz o seguinte codigo pra converter em byte array
public static byte[] bufferedImageToByteArray(BufferedImage img) {
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
            encoder.encode(img);
            return os.toByteArray();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return null;
    }
esse código funciona perfeitamente, só que o netbeans diz que a api é proprietaria da sun e talls. dai pensei se nao tem outro jeito sem usar essa api proprietaria da sun. e to vendo se acho algo aqui, mais até agora nd... eu achei tbem esse aqui
// você tem um BufferedImage
BufferedImage image = ImageIO.read(url);

// pode converter para um array de bytes assim:
byte[] a = ((DataBufferByte)(image).getRaster().getDataBuffer()).getData();
do colega cassioso no tópico [url]http://www.guj.com.br/posts/list/21227.java[/url], mas não consegui fazer funcionar, ClassCastException int to byte... vc ou alguém conhece alguma maneira de fazer a conversão, ou melhor, obter um byte array de um objeto BufferedImage, sem usar as classes listadas abaixo: [list]com.sun.image.codec.jpeg.ImageFormatException;[/list] [list]import com.sun.image.codec.jpeg.JPEGCodec;[/list] [list]import com.sun.image.codec.jpeg.JPEGImageEncoder;[/list] Vlw as respostas t+
cassioso

Cleiton, experimente fazer o seguinte teste, coloque um arquivo pequeno, 10x10 pixels por exemlo, chamado imagem.bmp na raiz do projeto e execute a seguinte classe:

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class TesteImagem {

	public static void main(String[] args) {
		
		File url = new File("imagem.bmp");
		
		// você tem um BufferedImage  
		BufferedImage image=null;
		try {
			image = ImageIO.read(url);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
   
		// pode converter para um array de bytes assim:  
		byte[] arr = ((DataBufferByte)(image).getRaster().getDataBuffer()).getData();
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	
	}

}

ela fará a leitura do arquivo e imprimir os bytes dela. Aqui funciona bem.

cleiton_herrmann

o cassioso blz?

o cara vlw por ter postado ai, estranho velho, eu tava usando a mesma linha pra obter o array de bytes, nao sei o pq de estar dando erro, mas agora executei o seu codigo e funcionou...

vlw ai por ter postado um código que funciona, hehehe

na verdade eu ja tinha resolvido usando esse codigo
public static byte[] bufferedImageToByteArray(BufferedImage bi) {
    try {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(bi, "jpg", bos);
        return bos.toByteArray();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public static BufferedImage byteArrayToBufferedImage(byte b[]) {
    try {
        InputStream in = new ByteArrayInputStream(b);
        BufferedImage img = ImageIO.read(in);
        return img;
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return null;
}
é que eu quero trabalhar com uma imagem, mas sem ter ela em um endereço no hd tipo, d:\.... manja, eu gravo ela em um arquivo db4o, e esse código resolve isso, nao preciso passar um endereco de um arquivo pra ler e gravar...

flw cara t+

Criado 7 de abril de 2008
Ultima resposta 24 de abr. de 2008
Respostas 6
Participantes 4