2011-05-09 7 views
5

Estoy dejando que el usuario importe clases similares a un complemento desde una ubicación remota utilizando URLClassLoader, por lo que estas clases importadas NO existen en la ruta de compilación (sin embargo, todas implementan una interfaz IPlugin que se incluye).¿Equivalente a ObjectOutputStream, guardando no solo su estado sino el objeto completo?

Supuse que uno podría simplemente usar ObjectOutputStream para guardar todos los complementos cargados en el archivo, y luego leerlos con ObjectInputStream. Sin embargo, ese no parece ser el caso, ya que todo lo que guarda es el estado del objeto, no la lógica que lo contiene (es decir, los métodos).

Lo que me espero que hacer es guardar la lista de plugins cargados (activePlugins) con ObjectOutputStream:

ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*); 
oos.writeObject(activePlugins); 
oos.close(); 

A continuación, en otro tiempo de ejecución, carga/restaurar todos estos complementos con ObjectInputStream:

ObjectInputStream ois = new ObjectInputStream(*fileinputstream*); 
activePlugins = (ArrayList<IPlugin>) ois.readObject(); 

Pero dado que las clases de objeto reales no están disponibles en la ruta de compilación (están en otro lugar en el disco duro), se vuelve loco. Lo que busco es una forma de cargar objetos sin tener las clases disponibles, es decir, cargar objetos con estados y sin dependencias.

+0

También debe serializar los bytes de la clase en la transmisión. Puede obtener los bytes de la clase a través de 'getResourceAsStream'. Luego, en el otro lado, use estos bytes para cargar clases en un cargador de clases personalizado, luego aplique la clase resultante a su interfaz y use el objeto a través de su interfaz. – MeBigFatGuy

Respuesta

4

necesita su propio cargador de clases. básicamente desea algo similar a URLClassLoader, pero con la capacidad de descargar y almacenar en caché los archivos jar localmente. Es posible que desee consultar la extensión de URLClassLoader o la implementación de algo similar. Básicamente, necesitas simplemente engancharte en la parte donde se descarga el contenedor y pegarlo en algún lugar localmente (o cargarlo desde esa ubicación almacenada en caché si ya lo descargaste previamente).

+2

He estado viendo la pregunta por un par de minutos. Al principio no pude entender el problema, ya que ambos están hablando de estado y métodos. Creo que parece que en realidad ambos quieren tener un cargador de clases personalizado (NetworkClassLoader) y ObjectOutputStream. Parece que quiere guardar el estado de los complementos, y no solo los complementos. ¿O estoy totalmente fuera del mapa ahora? – Kaj

+0

buen punto, me perdí que en realidad _did_ quería que los estados objeto también se guardaran. actualicé mi respuesta. – jtahlborn

1

Eche un vistazo a RMI. Esto amplía la serialización con un mecanismo de transferencia de clase, por lo que puede serializar y deserializar objetos de (en el receptor) clases desconocidas en el pozo, y ejecutar sus métodos.

Esto se hace usando algún mecanismo de carga de clase remota, creo.

+1

El uso de RMI solo por el hecho de cargar clases suena mal. Él no quiere ejecutar métodos remotos por lo que yo lo he entendido. – Kaj

+0

RMI usa la función de anotación de Serialización de Java para enlazar con la URL del código (aunque se puede desactivar). –

0

Altought Java no es mi marco de programación principal, he visto el mismo problema en otros "frameworks" como PHP, Delphi y C#.

Una solución es haber declarado los archivos de clase & rutas.

La otra sugerencia, es que, como usted explicitó, no le importa la lógica, solo el estado ("datos"), podría declarar una clase genérica que almacena el valor de las propiedades.

Cuestiones relacionadas