Java序列化问题和Groovy在Java中使用的问题

1.Java序列化问题:普通Java类序列化简单,但是我要序列化的不是普通Java类,而是代理类。源码如下:Speakingsp=(Speaking)Proxy.newP... 1.Java序列化问题:
普通Java类序列化简单,但是 我要序列化的不是普通Java类,而是代理类。
源码如下:
Speaking sp = (Speaking) Proxy.newProxyInstance(TestGroovyRun.class
.getClassLoader(), new Class[] { Speaking.class,Serializable.class },
new InvocationHandler() {

public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
System.out.println("Hi,我做了些手脚!!");
MySpeak ms = new MySpeak();
Object o = method.invoke(ms, null);
return o;
}

class MySpeak implements Speaking{

public String speak() {

return "H";
}
}
});

写得怪异了, 总归来说sp只是个代理了MySpeak 的一个对象。 使用Class c[] = sp.getClass().getInterfaces(), 也发现sp实现了Serializable接口。
但是当我序列化它时候就出现java.io.NotSerializableException 异常 ,
待高手解释。

2.Groovy是个动态语言,我使用Spring的
<lang:groovy id="test" >
<lang:inline-script>
class xxxxx{
//代码省略。。。。。。
}
</lang:inline-script>
</lang:groovy>

使用Context当然能够找到id="test" 的对象,但是这个对象是被转换为Java对象,还是属于Groovy对象? 可以序列化,但是反序列化时候就出现异常:ClassNotFoundException。。。。。。
待高手解释:Spring给我的对象是Groovy对象还是已经被转为Java对象了?
展开
 我来答
pe...n@sina.com
2011-02-14 · TA获得超过893个赞
知道小有建树答主
回答量:189
采纳率:0%
帮助的人:227万
展开全部
proxy对象是不能序列化的,就算能序列化也不能反序列化,因为proxy对象的类是动态生成出来的,序列化后,反序列化时目标jVM肯定没有加载过这个代理类。
有个变通的方法,就是获取到对象本身,序列化;反序列化后获取到原对象,再重新用代理包装即可获得反序列化后的代理对象了。不知道是否贴题。下面有个例子,虽然没有序列化和反序列化,但是基本实现了获取对象本身这个功能,希望能帮到你。

另外groovy对象也是java对象,应该仍然保持groovy对象本身(个人理解,groovy我也是略懂皮毛),spring应该不会对对象本身动刀子,最多加层代理啥的。
//-------------------------------------------------------------------------------
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test implements TestInterface{
public static void main(String[] args) {
final Test t = new Test();
TestInterface t2 = (TestInterface) Proxy.newProxyInstance(
Test.class.getClassLoader(),
Test.class.getInterfaces(),
new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
return method.invoke(t, args);
} catch(InvocationTargetException ite) {
throw ite.getTargetException();
}
}
}
);
t2.test();
//使用这种方式获取原对象,序列化原对象后,反序列化原对象 重新构造代理
System.out.println(t2.getThis().getClass());
System.out.println(t2.getClass());

}

public void test() {
System.out.println(1);

}
public Test getThis() {
return this;
}
}

interface TestInterface{
public void test() ;
public Test getThis() ;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式