2009-08-17 14 views
6

Tengo un programa Java simulado, que quiero escribir en Clojure. Tiene una clase que implementa Serializable y una función que lo guarda. Dado que nunca he escrito tales programas en Clojure, quería saber cuál sería la forma correcta de abordar este problema, qué estructuras de datos de Clojure y llamadas de API utilizarías.¿Cuál sería la forma correcta de serializar este objeto Java en Clojure?

import java. io. *; 

public class Box implements Serializable 
{ 
private int width; private int height; 
public void setWidth(int w) 
    { width =w;} 
public void setHeight(int h) 
    {height = h;} 
} 

public static void main (String[] args) 
{ 
    Box myBox =new Box(); 
    myBox.setWidth(50); 
    myBox.setHeight(20) ; 

try { 
    FileoutputStream fs = new File("foo.ser"); 
    ObjectOUtputStream os = new ObjectOutputStream(fs); 
    os.writeObject(myBox); 
    os . close() ; 

} catch (Exception ex) {}}

Respuesta

9

Si desea hacerlo en pura Clojure, utilizar el lector de Clojure.

(use 'clojure.contrib.duck-streams) 

(defn serialize [o filename] 
    (binding [*print-dup* true] 
    (with-out-writer filename 
    (prn o)))) 

(defn deserialize [filename] 
    (read-string (slurp* filename)))

Ejemplo:

user> (def box {:height 50 :width 20}) 
#'user/box 
user> (serialize box "foo.ser") 
nil 
user> (deserialize "foo.ser") 
{:height 50, :width 20} 

Esto funciona para la mayoría de los objetos de Clojure ya, pero no para la mayoría de los objetos de Java.

user> (serialize (java.util.Date.) "date.ser") 
; Evaluation aborted. 
No method in multimethod 'print-dup' for dispatch value: class java.util.Date 

Pero puede agregar métodos a la print-dup multimethod para permitir Clojure para imprimir otros objetos legible.

user> (defmethod clojure.core/print-dup java.util.Date [o w] 
     (.write w (str "#=(java.util.Date. " (.getTime o) ")"))) 
#<MultiFn [email protected]> 
user> (serialize (java.util.Date.) "date.ser") 
nil 
user> (deserialize "date.ser") 
#<Date Mon Aug 17 11:30:00 PDT 2009> 

Si usted tiene un objeto de Java con un método de serialización de Java nativa, sólo puede utilizar eso y no molestar a escribir su propio código para hacerlo.

Cuestiones relacionadas