2009-08-17 86 views
6

我有一个虚拟的Java程序,我想在Clojure中编写。它有一个实现Serializable的类和一个保存它的函数。由于我从未在Clojure中编写过这样的程序,因此我想知道什么是解决此问题的正确方法,您将使用哪种Clojure数据结构和API调用?在Clojure中序列化这个Java对象的正确方法是什么?

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() ; 

}赶上(例外){}}

回答

9

如果你想这样做纯Clojure中,使用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)))

例子:

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

这适用于大多数Clojure的对象了,但失败对于大多数Java对象。

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

但是你可以添加方法到print-dup多法允许的Clojure到可读取打印其他对象。

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> 

如果你有一个本地Java序列化方法的Java对象,你可以使用而不用费心编写自己的代码来做到这一点。

相关问题