Problema com Objeto Serializado

3 respostas
K

Gente estou com o seguinte problema, recebo um arquivo serializado que jogo em tres servidores unix.
em cada servidor eu abro o arquivo e altero uma propriedade de uma classe colocando valores distintos por servidor.
O mesmo arquivo eu consigo alterar em 2 servidores, porém no terceiro me ocorre um erro:

java.lang.ExceptionInInitializerError at sun.misc.Unsafe.ensureClassInitialized(Native Method) at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:37) at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:148) at java.lang.reflect.Field.acquireFieldAccessor(Field.java(Compiled Code)) at java.lang.reflect.Field.getFieldAccessor(Field.java(Compiled Code)) at java.lang.reflect.Field.getLong(Field.java:475) at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1707) at java.io.ObjectStreamClass.access$400(ObjectStreamClass.java:97) at java.io.ObjectStreamClass$4.run(ObjectStreamClass.java:443) at java.security.AccessController.doPrivileged1(Native Method) at java.security.AccessController.doPrivileged(AccessController.java(Compiled Code)) at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java(Compiled Code)) at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java(Compiled Code)) at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java(Compiled Code)) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java(Compiled Code)) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java(Compiled Code)) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java(Compiled Code)) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java(Compiled Code)) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java(Compiled Code)) at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java(Compiled Code))
Depois ele indica o erro de mull pointer que ocorreu dentro de uma das classes do arquivo serializado: (Estas classes não são de meu domínio, tenho apenas o jar)

Caused by: java.lang.NullPointerException
	at com.empresaExterna.config.business.ConfigAccess.instancia(ConfigAccess.java:47)
	at com.empresaExterna.chamada.runtime.RuntimeChamada.<clinit>(Unknown Source)

Não entendo porque em dois servidores eu consigo abrir e no terceiro não:
Segue o código que uso para ler/editar:

InputStream input = new FileInputStream(destino); ObjectInputStream ois = new ObjectInputStream(input); ClasseExterna c = (ClasseExterna) ois.readObject(); //Bem aqui é que ocorre o Erro c.getRuntimeProperties().setNomeServidor(serverName); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(destino)); out.writeObject(c); out.close();

Já bati a versão do jre e versão do SO, mas não peguei nada ainda.
Esta classe serializada é um objeto grande, composto de várias classes.

3 Respostas

gilmaslima

Pelo seu erro parece ser as versões da JVM que estão diferentes, esse erro é comum quando você compila numa versão de JVM e tenta executar em outra versão.

Faz um teste, compila na máquina que esta dando erro e rode novamente a aplicação…

K

Não consigo compilar na máquina 3, minha chave de usr é restrita. Mas verifiquei as versões nas máquinas envolvidas:

Local (PC onde o arquivo é gerado) 1.5.0
Máquina 1: Classic VM (build 1.4.2, J2RE 1.4.2 IBM AIX build ca142-20070708 (SR9) (JIT enabled: jitc))
Máquina 2: Classic VM (build 1.4.2, J2RE 1.4.2 IBM AIX build ca142-20070708 (SR9) (JIT enabled: jitc))
Máquina 3:Classic VM (build 1.4.2, J2RE 1.4.2 IBM AIX build ca142-20070708 (SR9) (JIT enabled: jitc))

Ok as tres máquinas são diferentes da origem do arquivo, mas se for JMV, por que funciona na 1 e 2 ?

K

Avancei pouco sobre o java.lang.ExceptionInInitializerError :

Bom descobri que o uso de reflection não é muito bom, em relação a performance, segurança e portabilidade.
Descobri a linha de código exata que está aparecendo o erro, e aparentemente é problema de reflection que não conseguiu criar o objeto. So não sei o que pode estar gerando isto.

Criado 16 de dezembro de 2008
Ultima resposta 19 de dez. de 2008
Respostas 3
Participantes 2