关于java序列化的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java序列化的问题相关的知识,希望对你有一定的参考价值。
>>请问,为什么这个异常在conncetion中抛出,序列化不是都在远程传输中使用吗?而我这个对象也没有存储在session中,为什么这个对象要序列化啊??请高手赐教。。。如果满意,一定追分!!!!!
<2008-4-23 上午09时27分58秒 CST> <Error> <HTTP Session> <BEA-100028> <Could not
deserialize session data.
java.io.NotSerializableException: oracle.jdbc.driver.OracleConnection
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
:1330)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
02)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
a:1245)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
:1330)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
02)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
a:1245)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
at weblogic.servlet.internal.AttributeWrapper.convertObjectToBytes(Attri
buteWrapper.java:136)
at weblogic.servlet.internal.AttributeWrapper.getObject(AttributeWrapper
.java:112)
at weblogic.servlet.internal.AttributeWrapper.getObject(AttributeWrapper
.java:69)
at weblogic.servlet.internal.session.SessionData.getAttribute(SessionDat
a.java:431)
at jsp_servlet._system.__sys_supp_settype._jspService(__sys_supp_settype
.java:135)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run
(ServletStubImpl.java:971)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubIm
pl.java:402)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubIm
pl.java:305)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationActio
n.run(WebAppServletContext.java:6350)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(Authenticate
dSubject.java:317)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:
118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppSe
rvletContext.java:3635)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestIm
pl.java:2585)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
>
TO baimaxiaosheng - 秀才 三级
您好,你说的太有道理了,但是有一点我不明白,为什么对象型数据要序列化呢?
我看了一些资料,说是放在session中的数据都要序列化,因为weblogic会对session中的数据进行持久化,我有一个对象login放在session中,
其字段描述如下:
private static final long serialVersionUID = -8783454813441161035L;
private PubDb db = new PubDb();
private PubFunc func = new PubFunc();
private Pubhtml ph = new PubHtml();
private String us_id = ""; // 人员表ID
private String username = ""; // 姓名
private String password = ""; // 密码
private String purview = ""; // 权限
private Connection conn = null;
这里的conn没有进行序列化,所以一直报这个异常,请问一下,这个connction我怎么加序列化呢?这个不是我的类,是JDBC中的类。。
java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以根据字节流中的信息来重构一个相同的对象。序列化机制在java中有着广泛的应用,EJB、RMI等技术都是以此为基础的。
序列化机制是通过java.io.ObjectOutputStream类和java.io.ObjectInputStream类来实现的。在序列化(serialize)一个对象的时候,会先实例化一个ObjectOutputStream对象,然后调用其writeObject()方法;在反序列化(deserialize)的时候,则会实例化一个ObjectInputStream对象,然后调用其readObject()方法。
上面您的错误,就是在于有一个或者几个没有"序列化"的数据,导致没有办法创建输出流,导致发生的java.io.NotSerializableException。
之所以要序列化,我猜测是因为您的数据里面存在一个对象型的数据,但是该对象没有实现序列化。比如:您有一个字段为address,这个字段您是通过一个类Address来描述的,Address里面可能有province、city、street等等属性或者一些setter 和getter,如果这个类,没有实现序列化,往往会出现这个问题。
毕竟没有看到程序,是我的一个猜测,请检查一下程序或者发出来进行进一步讨论。 参考技术A 我觉得Connection这个类没有必要序列化,你把Connection对象通过session传递有什么用处呢,Connection应该是一个对数据库的连接,你如果想让接收方对数据库进行连接的话,应该在传递的时候传递远程数据库的连接方式,比如驱动链接,数据库地址,数据库用户名密码等等,接收方在操作的时候新建立一个Connection对象用你传递给他的信息进行连接就可以了.
而关于建立一个Connection所需要的条件的封装,序列化,传递应该很简单吧! 参考技术B at weblogic.servlet.internal.session.SessionData.getAttribute(SessionDat
以上是关于关于java序列化的问题的主要内容,如果未能解决你的问题,请参考以下文章