Méthodes de sérialisation Java

Il est possible de sérialiser une méthode? Parce que quand je regarde la documentation, la classe Method n’implémente pas Serializable. Alors, existe-t-il des alternatives?

Étant donné que Method n’implémente pas Serializable, il ne peut pas être sérialisé à l’aide de l’API de sérialisation Java standard.

Une solution de contournement consisterait à sérialiser manuellement uniquement le nom de la classe et de la méthode et ses types de parameters. Vous pouvez ensuite recréer l’instance de méthode pendant la désérialisation.

Cela dépend de ce que tu veux dire. En réalité, comme les gars déjà mentionnés, la méthode ne peut pas être sérialisée. Mais si vous souhaitez sérialiser la logique implémentant cette méthode et (par exemple) l’envoyer sur le réseau, c’est possible. Cette sérialisation peut être effectuée en sérialisant la classe elle-même. En fait, .class est déjà une séquence d’octets pouvant être stockée (et généralement stockée) dans des fichiers. Vous pouvez simplement l’envoyer via le réseau si vous le souhaitez, puis instancier en utilisant Class.forName (). De plus, vous pouvez faire mieux: utilisez HttpClassLoader, transmettez-lui l’URL HTTP où votre classe est disponible, créez une instance de classe à l’aide de ce chargeur de classe et exécutez la méthode de votre choix.

vous pouvez utiliser le wrapper suivant pour autoriser la sérialisation de la méthode:

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(); Ssortingng methodName = in.readUTF(); Class[] parameterTypes = (Class[])in.readObject(); try { method = declaringClass.getMethod(methodName, parameterTypes); } catch (Exception e) { throw new IOException(Ssortingng.format("Error occurred resolving deserialized method '%s.%s'", declaringClass.getSimpleName(), methodName), e); } } } 

Si vous vous posez la question, est-ce possible? Non: il n’implémente pas Serializable . De plus, Method est une classe finale, vous ne pouvez donc pas la sous-classer afin d’append des fonctionnalités.

En fait, toutes les méthodes font partie de leur classe et Class implémente Serializable. Comme vous aurez de toute façon besoin d’un object de la classe pour appeler la méthode, vous pouvez simplement envoyer la classe (ou l’object).

Du côté de la réception, cependant, il y aurait généralement créé un object de la version de la classe.

Si vous souhaitez l’utiliser pour appeler votre méthode à distance, consultez RMI (package java.rmi.* ) – elle prend également en charge l’envoi d’objects lorsque le côté distant ne possède pas (encore) les données de classe.

La bibliothèque Thought Works xStream le fait très bien. Voici un tutoriel de deux minutes.

Python autorise le pickling des méthodes de niveau supérieur. En Java, la méthode pour appeler des méthodes sur un autre hôte consiste à utiliser un mécanisme RMI. Le bytecode de classe peut être envoyé sur le réseau et toutes les dépendances sont satisfaites – utilisez pour cela l’ URLClassloader .