serializacion - Métodos de serialización de Java
serializacion c++ (7)
¿Es posible serializar un método? Porque cuando miro la documentación, la clase Método no implementa Serializable. Entonces, ¿hay alguna alternativa?
Dado que Method no implementa Serializable, no puede ser serializado utilizando la API estándar de Java Serialization.
Una solución alternativa sería serializar manualmente solo el nombre de la clase y el método y sus tipos de parámetros. A continuación, puede volver a crear la instancia del método durante la deserialización.
Depende a que te refieres. Realmente, como los chicos ya mencionaron el método no puede ser serializado. Pero si desea serializar la lógica que implementa el método y (por ejemplo) enviarlo a través de la red, es posible. Esta serialización se puede realizar mediante la serialización de la propia clase. En realidad .class ya es una secuencia de bytes que se pueden almacenar (y normalmente se almacenan) en archivos. Solo puede enviarlo a través de la red si lo desea y luego crear una instancia utilizando Class.forName (). Además, puede hacerlo mejor: use HttpClassLoader, pásele la URL HTTP donde está disponible su clase, cree una instancia de clase con este cargador de clase y ejecute el método que desee.
En realidad, todos los métodos son parte de su clase, y la Class
implementa Serializable. Como de todos modos necesitará un objeto de la clase para llamar al método, simplemente podría enviar la clase (o el objeto).
En el lado de recepción, sin embargo, generalmente se crearía un objeto de la versión de la clase allí.
Si desea usar esto para invocar su método en un lado remoto, observe el RMI (paquete java.rmi.*
) - también es compatible con el envío de objetos cuando el lado remoto no tiene (todavía) los datos de clase.
Python permite la selección de métodos de nivel superior, en Java la forma de llamar a métodos en otro host es a través de algún tipo de mecanismo de RMI. El bytecode de la clase se puede enviar por cable y si se cumplen todas las dependencias, use URLClassloader para hacer esto.
Si simplemente se pregunta, es posible, que no: no implementa Serializable
. Además, el Method
es una clase final, por lo que no puede crear subclases para agregar alguna funcionalidad.
puede utilizar el siguiente envoltorio para permitir la serialización de métodos:
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);
}
}
}
La biblioteca de Thought Works xStream hace muy bien. Aquí hay un tutorial dos minutos.