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对象了? 展开
普通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对象了? 展开
1个回答
展开全部
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() ;
}
有个变通的方法,就是获取到对象本身,序列化;反序列化后获取到原对象,再重新用代理包装即可获得反序列化后的代理对象了。不知道是否贴题。下面有个例子,虽然没有序列化和反序列化,但是基本实现了获取对象本身这个功能,希望能帮到你。
另外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() ;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询