首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java序列化方法

Java序列化方法
EN

Stack Overflow用户
提问于 2011-02-07 16:18:17
回答 7查看 24.2K关注 0票数 19

可以序列化一个方法吗?因为当我查看文档时,方法类并没有实现Serializable。那么有没有其他选择呢?

EN

回答 7

Stack Overflow用户

发布于 2011-02-07 16:22:52

由于方法不实现Serializable,因此无法使用标准Java Serialization API对其进行序列化。

一种解决方法是手动序列化类和方法的名称及其参数类型。然后,您可以在反序列化过程中重新创建方法实例。

票数 10
EN

Stack Overflow用户

发布于 2011-02-07 16:29:25

这取决于你是什么意思。真的,正如前面提到的,方法不能序列化。但是,如果您希望序列化该方法实现的逻辑并(例如)将其通过网络发送,则是可能的。这个序列化可以通过序列化类本身来完成。实际上,.class已经是一个可以存储(并且通常是存储)在文件中的字节序列。如果需要,可以只通过网络发送它,然后使用Class.forName()进行实例化。此外,您还可以做得更好:使用HttpClassLoader,将您的类可用的HTTP URL传递给它,使用这个类加载器创建类实例,并运行您想要的任何方法。

票数 8
EN

Stack Overflow用户

发布于 2012-10-26 20:15:34

您可以使用以下包装器来允许方法序列化:

代码语言:javascript
复制
public class SerializableMethod implements Serializable
{
    private static final long serialVersionUID = 6631604036553063657L;
    private Method method;

    public SerializableMethod(Method method)
    {
        this.method = method;
    }

    public Method getMethod()
    {
        return method;
    }

    private void writeObject(ObjectOutputStream out) throws IOException
    {
        out.writeObject(method.getDeclaringClass());
        out.writeUTF(method.getName());
        out.writeObject(method.getParameterTypes());
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
    {
        Class<?> declaringClass = (Class<?>)in.readObject();
        String methodName = in.readUTF();
        Class<?>[] parameterTypes = (Class<?>[])in.readObject();
        try
        {
            method = declaringClass.getMethod(methodName, parameterTypes);
        }
        catch (Exception e)
        {
            throw new IOException(String.format("Error occurred resolving deserialized method '%s.%s'", declaringClass.getSimpleName(), methodName), e);
        }
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4919205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档