afilipebarbosa Posted April 15, 2009 at 12:05 AM Report #256821 Posted April 15, 2009 at 12:05 AM Boas amigos, estou a começar a trabalhar em JAVA RMI, e após a fase inicial de adaptação a esta nova tecnologia (pelo menos para mim), estou a ter uns problemas.. Após criar aquela treta da classes que liga a base de dados mysql através do driver xpto, corri o servidor registando no Naming o objecto como normalmente se faz.. até aqui tudo bem, o problema é que um método dessa classe/interface devolve um ResultSet. E segundo o java esse ResultSet não pode ser transmitido através do rmi, dando o seguinte erro: Erro: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.mysql.jdbc.JDBC4ResultSet Já tentei procurar no google, mas de todos os casos que vi, ninguém deu uma possível solução, tirando a de não retornar o ResultSet lol. De qualquer forma gostava de saber se alguém tem ideia de como resolver este problema, pois imagino que este problema seja muito vulgar para quem trabalha com rmi. Aguardo as vossas respostas. Cumprimentos André Barbosa.
bruno1234 Posted April 15, 2009 at 12:13 AM Report #256823 Posted April 15, 2009 at 12:13 AM Eu não trabalho com java, n tou bem dentro do assunto, mas diria q o q deve ser feito é o seguinte: - Obter o result set através do driver para o mysql como estás a fazer. - Criar um Array de uma entidade conhecida (ex: OsMeusDados[]) - Usar um dataReader (ou lá cm se chama em java) que passe os dados do result set para os teus campos (ex: OsMeusDados[0] = new OsMeusDados(); OsMeusDados[0].Nome = rs.Read(...), isto dentro de um while rs.hasNext()) mais uma vez não tou a par de como é isto em java. - O método RMI deve depois devolver esse array, assim penso q já não vais ter problemas. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
afilipebarbosa Posted April 15, 2009 at 12:24 AM Author Report #256826 Posted April 15, 2009 at 12:24 AM boas bruno1234, agradeço desde já a tua resposta. Por acaso também já tinha pensado em colocar o ResultSet numa Hash onde a key eram os atributos da tabela e o valor da key era um arrayList com os respectivos dados. Pensei também criar um novo objecto serializable que tinha como variável um resultSet e devolvia esse objecto em vez do ResultSet. No entanto, ainda não tentei nenhuma delas, nem sei se realmente funcionam. De qualquer forma a tua resposta foi sem duvida um apoio àquilo que tinha idealizado. No entanto, vou ficar a aguardar as resposta de outros utilizadores, pois pode haver uma solução mais "directa". De qualquer forma, gostava de te agradecer mais uma vez pela tua resposta. Cumprimentos.
Knitter Posted April 15, 2009 at 08:30 AM Report #256846 Posted April 15, 2009 at 08:30 AM Não há resposta mais directa a esse caso, se o ResultSet não é serializável, então não há forma de o passar através de RMI, já que esta tecnologia usa a serialização como mecanismo de transferência de informação. A solução passa por retirares todos os dados do ResultSet para dentro de outro objecto, que simule o ResultSet ou que te ofereça a estrutura que necessitas e que implemente obrigatoriamente uma das interfaces de serialização, e depois usar esse objecto. Lembra-te que a serialização necessita que todos os objectos sejam serializaveis, assim mesmo que coloques o ResultSet dentro de um objecto serializavel, vais ter a mesma excepção. Se um objecto A é composto por outros objectos, não basta que A seja serializavel mas que todos os objectos que constituem A também o sejam, e assim sucessivamente. No fundo, o sistema base de serializacao apenas consegue guardar dados primitivos.
cheires Posted April 15, 2009 at 11:20 AM Report #256867 Posted April 15, 2009 at 11:20 AM Porque não transformas o ResultSet num objecto? E depois passas o objecto pelo RMI. para fazer isso tens que criar um objecto igual ao ResultSet. penso que o que queiras passr por RMI seja o resultado de uma qualquer query à BD. Transformas esse resultado para um objecto e tens o problema resolvido.
magician Posted April 15, 2009 at 11:58 AM Report #256880 Posted April 15, 2009 at 11:58 AM Acho que a melhor solução é mesmo passar o ResultSet para uma List ou um Map dependendo do tratamento que os dados iram ter. Até pk o ResultSet não é uma estrutura muito boa para trabalhar dados. I haven’t lost my mind; it’s backed up on DVD somewhere!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now