Методы сериализации Java - PullRequest
16 голосов
/ 07 февраля 2011

Можно ли сериализовать метод? Потому что, когда я смотрю на документацию, класс Method не реализует Serializable. Так есть ли альтернативы?

Ответы [ 7 ]

10 голосов
/ 07 февраля 2011

Поскольку метод не реализует Serializable, его нельзя сериализовать с использованием стандартного API-интерфейса Java Serialization.

Обходным решением будет вручную сериализовать только имя класса и метода и его параметры.Затем вы можете воссоздать экземпляр метода во время десериализации.

7 голосов
/ 07 февраля 2011

Это зависит от того, что вы имеете в виду.Действительно, как уже упоминалось, парни не могут быть сериализованы.Но если вы хотите сериализовать логику, которую реализует метод, и (например) отправить ее по сети, это возможно.Эта сериализация может быть выполнена путем сериализации самого класса.На самом деле .class - это уже последовательность байтов, которую можно хранить (и, как правило, хранить) в файлах.Вы можете просто отправить его по сети, если хотите, а затем создать экземпляр с помощью Class.forName ().Более того, вы можете сделать лучше: используйте HttpClassLoader, передайте ему URL-адрес HTTP, на котором доступен ваш класс, создайте экземпляр класса с помощью этого загрузчика классов и запустите любой метод, который вы хотите.

4 голосов
/ 26 октября 2012

вы можете использовать следующую оболочку, чтобы разрешить сериализацию метода:

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);
        }
    }
}
1 голос
/ 07 февраля 2011

На самом деле, все методы являются частью своего класса, а Class делает реализующим Serializable. Так как в любом случае вам понадобится объект класса для вызова метода, вы можете просто отправить класс (или объект).

Однако на принимающей стороне обычно создается объект версии класса.

Если вы хотите использовать это для вызова метода на удаленной стороне, взгляните на RMI (пакет java.rmi.*) - он также поддерживает отправку объектов, когда на удаленной стороне (пока) нет данных класса.

1 голос
/ 07 февраля 2011

Если вам просто интересно, возможно ли это, чем нет: он не реализует Serializable. Кроме того, Method является последним классом, поэтому вы не можете создать его подкласс для добавления некоторых функций.

0 голосов
/ 07 февраля 2011

Python допускает выборку методов верхнего уровня, в Java способ вызова методов на другом хосте - через какой-то механизм RMI.Байт-код класса может быть отправлен по проводам, и, если все зависимости удовлетворены - используйте URLClassloader , чтобы сделать это.

0 голосов
/ 07 февраля 2011

Thought Works библиотека xStream делает это очень хорошо. Вот двухминутный урок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...