- PR -

オブジェクトのデシリアライズについて

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/02/24
投稿数: 55
投稿日時: 2005-08-08 20:38
オブジェクトのデシリアライズを行っているときに
以下のエラーが発生しました。
対処法が分からないのでどうか助けてください。

コード:

詳細メッセージ: java.io.NotSerializableException:org.apache.commons.dbcp.BasicDataSource
(スタックトレース)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1302)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
java.util.HashMap.writeObject(HashMap.java:958)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:324)
java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:795)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1294)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1302)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1302)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1302)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1302)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
up_down.DownLoadLogic.execute(DownLoadLogic.java:54)
system.DownLoadLogic.execute(DownLoadLogic.java:32)
jp.co.bs.panja.servlet.BaseServlet.doApplication(BaseServlet.java:107)
jp.co.bs.panja.servlet.PanjaServlet.doPost(PanjaServlet.java:253)
jp.co.bs.panja.servlet.PanjaServlet.doGet(PanjaServlet.java:217)
javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2416)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:601)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)
java.lang.Thread.run(Thread.java:536)





以下がデシリアライズする処理です。
ブラウザからアップロードしたファイルをデシリアライズしてます。
コード:

InputStream in = null;
// ファイル情報の取り込み
try {

if (DiskFileUpload.isMultipartContent(request)) {

DiskFileUpload fu = new DiskFileUpload();

//最大ファイルサイズの指定
fu.setSizeMax(100000);

List fileItems = fu.parseRequest(request);
Iterator iter = fileItems.iterator();

//アップされるファイルは常に1つと仮定する
FileItem aItem = (FileItem)iter.next();

if (aItem.isFormField()) {
//通常のフォームデータならスルー

} else {
in = aItem.getInputStream();

ここでエラー ObjectInput oin = new ObjectInputStream(in);

Object o = oin.readObject();

if (o instanceof InputManager) {
InputManager im = (InputManager) o;
request.setAttribute(InputManager.BEAN_NAME, im);
}

}
}

} catch(FileUploadException ee) {

throw ee;
} finally {
if (in != null) {
in.close();
}
}





デシリアライズするInputManagerというクラスは
以下のようなメソッドがあります
例外にdhcpとかあるので関係あるのでしょうか?

コード:

public class InputManager implements Serializable{
public InputManager(){}
public InputManager(ServiceEntity service, ServletConfig config) throws SQLException {}
public String getBackJsp(HttpServletRequest request) {}
public static InputManager getEvaluationManager(HttpServletRequest request) {}








[ メッセージ編集済み 編集者: 未記入 編集日時 2005-08-08 20:43 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-08-08 20:44 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-08-09 09:17 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-08-09 09:26 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-08-09 09:36 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-08-08 21:10
InputManagerのフィールドのインスタンスのフィールド・・・・と
遡って行くと、Serializableではないインスタンスがあるのでしょう。
それがDBCPのインスタンスってことです。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-08-08 22:28
引用:
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)

easi.web.ict.up_down.DownLoadLogic.execute(DownLoadLogic.java:54)



例外の送出元がwriteObject()になっていますよ。
タイミングは逆シリアル化ではなくシリアル化では?

厳密にはフィールドのみとは限りませんが、
あとはかつのりさんの発言の通りでしょう。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-08-09 00:07


[ メッセージ編集済み 編集者: インギ 編集日時 2005-08-09 15:40 ]
未記入
ベテラン
会議室デビュー日: 2005/02/24
投稿数: 55
投稿日時: 2005-08-09 09:38
> あしゅさん
逆シリアル化とシリアル化の両方でエラーが出てました。
貼り付けていたスタックトレースはシリアル化のほうでした。
コード:

詳細メッセージ: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.apache.commons.dbcp.BasicDataSource
(スタックトレース)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1278)
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
java.util.HashMap.readObject(HashMap.java:986)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:324)
java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:824)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1746)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
up_down.UploadLogic.execute(UploadLogic.java:64)
servlet.BaseServlet.doApplication(BaseServlet.java:107)
bs.panja.servlet.PanjaServlet.doPost(PanjaServlet.java:253)
javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2416)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:601)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)
java.lang.Thread.run(Thread.java:536)




引用:

厳密にはフィールドのみとは限りませんが、


フィールドのみとは限らないとはどういうことでしょうか?
メソッドの引数や戻り値もSerializableである必要がありますか?


> インギさん
ご指摘どうもありがとうございました。



[ メッセージ編集済み 編集者: 未記入 編集日時 2005-08-09 09:40 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-08-09 14:23
引用:
フィールドのみとは限らないとはどういうことでしょうか?
メソッドの引数や戻り値もSerializableである必要がありますか?



引数や戻り値は必要ないです。

厳密には、と書いたのは、void writeObject(ObjectOutputStream)などを
定義することでシリアル化をカスタマイズできるので、フィールド以外の
データも書き込まれる可能性がありえると。

あと、フィールドでもtransientなものは書き込まれません。
未記入
ベテラン
会議室デビュー日: 2005/02/24
投稿数: 55
投稿日時: 2005-08-09 20:44
> あしゅさん

ありがとうございます。分かりました。




再度よくチェックした結果、
ご指摘のとおり、プロパティを辿れば、
いろいろなものを参照してました。
修正して試したところ、
うまく動きました。
どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)