Excpetion RMI

To fazendo uma app q manda ResultSet´s de consultas de banco pela rede atraves de RMI p o cliente, qnd tento usar o cliente p usar o objeto remoto e pegar o ResultSet do servidor, p montar o JTable, dar seguinte excpetion:

Exceção em Comunicao.listaSistemas(): REMOTE EXCEPTION
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
        java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.postgresql.jdbc3.Jdbc3ResultSet
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:157)
        at catalogo_codata_servidor.Persistencia_Stub.listaSistemas(Unknown Source)
        at catalogo_codata_servidor.Comunicacao_teste.listaSistemas(Comunicacao_teste.java:26)
        at catalogo_codata_servidor.Teste_JTable.retornaModel(Teste_JTable.java:90)
        at catalogo_codata_servidor.Teste_JTable.<init>(Teste_JTable.java:25)
        at catalogo_codata_servidor.Teste_JTable$1.run(Teste_JTable.java:78)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.postgresql.jdbc3.Jdbc3ResultSet
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1303)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
        at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:290)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:139)
        ... 12 more
Caused by: java.io.NotSerializableException: org.postgresql.jdbc3.Jdbc3ResultSet
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
        at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:258)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:304)
        at sun.rmi.transport.Transport$1.run(Transport.java:153)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
        at java.lang.Thread.run(Thread.java:595)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at catalogo_codata_servidor.Teste_JTable.retornaModel(Teste_JTable.java:91)
        at catalogo_codata_servidor.Teste_JTable.<init>(Teste_JTable.java:25)
        at catalogo_codata_servidor.Teste_JTable$1.run(Teste_JTable.java:78)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

O banco eh o Postgres. Dps coloco as classes com mais detalhe, pq vo jantar agora, flws…

Caused by: java.io.NotSerializableException: org.postgresql.jdbc3.Jdbc3ResultSet

ResultSet não é um objeto serializavel… por isso não pode ser tafegado pela rede. Encapsule os dados em um objeto que implemente Serializable.

[]'s

entao como faco p/ encapsular esses ResultSets??? q objeto eu uso??? vc teria um exemplo de codigo q faz isto???

De uma olhada na documentação e procure entencer sobre serialização.

como falei antes, basicamente vc vai criar uma classe qualquer para colocar os dados do ResultSet que implemente a interface Serializable(olhe nas docs sobre ela), não é a unica maneira, mais é a mais facil. depois disso percorra seu ResultSet quardando os dados da consulta nesse objeto e trafegue ele pela rede.
vc precisa entender o que esta fazendo, se fizer isso, fica mais facil.

[]'s

puxa vida, os caras querem tudo mastigado, cria ai uma classe que implementa Serializable e bota o ResultSet dentro como Field ou cria ai uma classe que implementa Serializable e ResultSet(algo beem mais difícil).

Deixa ve se entendi, eu crio uma classe q implemente Serializable, dps coloco o ResultSet como uma propriedade (atributo) desta classe, e ponho p devolver pela rede esta classe, dps crio um metodo p devolver o ResultSet encalpsulado na classe p/ ser usada pelo cliente, eh isto?

Outra coisa: eu li q a exceção NotSerializableException eh lancada qnd o objeto nao pode ser sreializado, entao sera q n vai dar erro se eu por o ResultSet como um atributo da minha classe q eu vo serializar p ser trasnmitida via rede. Dai p resolver isso eu terei d passar um array de strings c os dados no lugar do ResultSet?

Estou tendo um problema semelhante a este… estamos desenvolvendo um aplicativo rmi na faculdade, onde devemos compartilhar arquivos, porém na hora detrafegar o dito arquivo estou recebndo os mesmos erros citados acima, estou tentando utilizar a FileInputStream , já criei uma outra classe serializavel ,com um FileInputStream dentro dela… mas msm assim me diz que “FileInputStream is not serializable”… alguma sugestão?

que classe posso usar para trafegar um arquivo qualquer(imagem, video, mp3)… obrigado

O problema de vocês é o design da aplicação :slight_smile:

O servidor não deveria retornar um ResultSet para o cliente. Dessa forma o cliente vai ter que mapear o ResultSet para os objetos ou qualquer coisa. Se você fizer toda a transformação já no servidor, o seu cliente não vai nem precisar saber que o servidor usa um banco de dados para suas operações.

[]'s