2009-08-17 20 views
6

Tôi có một Chương trình Java giả, mà tôi muốn viết trong Clojure. Nó có một lớp thực hiện Serializable và một hàm để lưu nó. Vì tôi chưa bao giờ viết các chương trình như vậy trong Clojure, tôi muốn biết chính xác cách nào để tiếp cận vấn đề này, cấu trúc dữ liệu Clojure và các cuộc gọi api nào bạn sẽ sử dụng?Điều gì sẽ là cách chính xác để tuần tự hóa đối tượng Java này trong 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) {}}

Trả lời

9

Nếu bạn muốn làm điều đó trong tinh khiết Clojure, sử dụng bộ đọc 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)))

Ví dụ:

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

này hoạt động cho hầu hết các đối tượng Clojure đã có, nhưng thất bại đối với hầu hết các đối tượng Java.

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

Nhưng bạn có thể thêm phương thức vào print-dup multimethod để cho phép Clojure in các đối tượng khác dễ đọc.

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> 

Nếu bạn có một đối tượng Java với phương thức tuần tự hóa Java, bạn chỉ có thể sử dụng và không bận tâm viết mã của riêng mình để thực hiện.

Các vấn đề liên quan