java.io.NotSerializableException:net.sourceforge.jtds.util.BlobBuffer$BlobInputStream
我在服务器上有一个数据库,要和他连接,请使用RMI。我在RMI服务器中创建了以下方法:java.io.NotSerializableException:net.sourceforge.jtds.util.BlobBuffer$BlobInputStream,java,sql-server,rmi,jtds,Java,Sql Server,Rmi,Jtds,我在服务器上有一个数据库,要和他连接,请使用RMI。我在RMI服务器中创建了以下方法: public InputStream getImageById(int id) { try { String sql = "SELECT photo FROM Product WHERE id = ?"; PreparedStatement ps = SQLConnection.getConnection().prepareStatement(s
public InputStream getImageById(int id) {
try {
String sql = "SELECT photo FROM Product WHERE id = ?";
PreparedStatement ps = SQLConnection.getConnection().prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
return rs.getBinaryStream("photo");
}
Log.message("Retonada imagem (ID: " + id + ")");
} catch (SQLException e) {
Log.message("Ocorreu um erro. (getImageById) " + e.getMessage());
}
return null;
}
但是当调用下面发生的错误时,有人能告诉我是什么吗
SEVERE: null
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: net.sourceforge.jtds.util.BlobBuffer$BlobInputStream
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:191)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at com.sun.proxy.$Proxy0.getImageById(Unknown Source)
at model.teste.main(teste.java:22)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: net.sourceforge.jtds.util.BlobBuffer$BlobInputStream
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1352)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:324)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:173)
... 4 more
Caused by: java.io.NotSerializableException: net.sourceforge.jtds.util.BlobBuffer$BlobInputStream
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1181)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:292)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:332)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at sun.rmi.transport.Transport$1.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724
您可能试图将
BlobBuffer.BlobInputStream
作为RMI调用的参数或结果传递
我怀疑它实际上是由rs.getBinaryStream(“photo”)
返回的对象,它不太可能是可序列化的
通过RMI传递任何类型的流
对象都不可能在没有大量工作的情况下工作。更好的方法(在本例中)是将blob作为字节[]
提取到内存中,并通过RMI返回。是的,因此我应该在JTD类中实现可序列化。但是我为RMI返回了一个字节数组。谢谢