【问题标题】:CGLib and serializationCGLib 和序列化
【发布时间】:2010-12-15 15:34:32
【问题描述】:

我想要做的是序列化一个类 实现了一个命令模式,以便我以后可以运行它。最好的 在所有世界中,我想序列化一个匿名类(我是 意识到这个问题)

让事情变得有点复杂的是,我在春天的环境中,而且 我希望序列化的匿名类在一个类中定义 由 CGLib 代理。

我的初步尝试:

public interface CallLater implements Serializeable {
     public run();
}


@Service
public class TestService implements Serializeable {

     public doSomethingMore() { /* Code */ }

     public void doSomething() {

         CallLater job = new CallLater() {
            private static final long serialVersionUID = 4415017504667122645L;

            @Override
            public void run() {
               doSomethingMore();

            }
         }

         storeJob(job);
    }
}

例如 storeJob 将序列化对象并将其存储以供以后使用 这部分失败。我没有包含此代码,但只是 ObjectOutputStream 调用

我知道整个 TestService 类都需要序列化。问题是 它被包装了一个 CGLib 代理并且这个代理没有实现可序列化 (我的猜测是这个不能序列化)。

非常感谢任何帮助。

【问题讨论】:

  • 堆栈跟踪会很有帮助
  • CGLib 代理是 TestService 的子类,因此实现了 Serializable,不是吗?也许它通过实现 writeObject 方法来防止序列化?
  • @Christian:我猜TestService 在某处引用了不可序列化的东西。

标签: java spring serialization command-pattern cglib


【解决方案1】:

您应该只序列化“目标”。所以你有对代理的引用吗?将获得该代理的目标,以便您可以对其进行序列化。

要做的事情是在序列化之前中断应用程序并在该上下文中挖掘您需要的属性。或者可能有一些代理工具或其他东西。

【讨论】:

  • CGLib 代理是否会改变方法的行为,从而使来自代理实例内的调用触发代理方法?如果是这样,您的解决方案中的反序列化 TestService 目标 Michael 将不再被代理,因此它将缺少代理添加到 doSomethingMore() 方法的任何行为。
  • 否 - spring 的默认 aop 不允许从实例中调用代理版本。 Spring 的 aop 工作在方法级别,不会改变实际的类。
  • 但是,您应该调查一下为什么会有代理,目的是什么?如果它很重要,那么重新加载 spring bean 并代理它可能会很棘手。也许您应该将代理层从您正在序列化的对象中抽象出来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多