2011-06-08 42 views
10

Có triển khai nào sẽ tuần tự hóa đối tượng Java dưới dạng mã Java không? Ví dụ, nếu tôi có đối tượngSắp xếp một đối tượng Java thành mã Java?

Map<String,Integer> m = new Map<String,Integer>(); 
m.put("foo",new Integer(21)); 

tôi có thể serialize này sử dụng

ObjectOutputStream out = new ObjectOutputStream(...); 
out.writeObject(m); 
out.flush(); 

và sản lượng sẽ, ví dụ, hãy

java.util.Map<String,Integer> m = new java.util.Map<String,Integer>(); 
m.put("foo",new Integer(21)); 

Tại sao bạn muốn điều này? Đôi khi nó dễ dàng hơn để tạo một phần các đối tượng phức tạp theo lập trình và sau đó hoàn thành việc tạo thủ công theo mã. Mã này sau đó có thể được bao gồm trong nguồn và phiên bản được kiểm soát với mọi thứ khác. Lưu ý rằng việc sử dụng các đối tượng được tuần tự hóa bên ngoài không phải là ngoại lệ.

Cảm ơn bạn đã giúp đỡ bất kỳ.

+2

Tôi không nghĩ rằng có cách nào (tiêu chuẩn) để làm điều này –

+1

(+1) cho "Tại sao bạn muốn điều này", nhiều câu hỏi muốn một cái gì đó bất thường, nhưng, nó không giải thích tại sao. Và có rất nhiều thế hệ mã tự động xuất hiện ở đó, khi công cụ chính được tạo ra và chỉ một vài chi tiết được mã hóa bằng tay ... – umlcat

+1

Một giải pháp thay thế khác sẽ là tạo mã tĩnh (bởi một thực thể bên ngoài) - vì vậy bạn không phải làm điều đó bằng tay. Lợi ích của việc này là bạn không cần phải chi tiêu các chu kỳ CPU deserializing nó. – mindas

Trả lời

1

Bạn có thể đạt được tùy chỉnh tuần tự hóa các đối tượng của bạn. Bạn phải triển khai hai phương pháp trong lớp học của mình với chữ ký chính xác:

private void writeObject(ObjectOutputStream oos) 
{ 
    //write your serialization code here 
} 


private void readObject(ObjectInputStream ois) 
{ 
    //write your de-serialization code here 
} 

Tuy nhiên, tính linh hoạt mà bạn đang tìm kiếm là rất đáng ngờ.

+0

Bạn sẽ vẫn nhận được tiêu đề luồng đối tượng. – EJP

0

Thay vào đó, bạn có thể sử dụng Clojure và tích hợp nó với mã Java của bạn không? Clojure là homoiconic - dữ liệu của nó giống hệt với mã của nó, vì vậy bạn có thể làm những việc như thế này rất dễ dàng.

Bản đồ là kiểu dữ liệu cơ bản trong Clojure.

3

Tôi đã triển khai chức năng này trong một dự án github mới. Bạn có thể tìm thấy dự án ở đây: Dự án

https://github.com/ManuelB/java-bean-to-code-serializer

này không có bất kỳ phụ thuộc bên ngoài trừ junit.

Hiện tại, nó chưa hỗ trợ mảng để tuần tự hóa. Tuy nhiên, đã có rất nhiều chức năng:

 Object2CodeObjectOutputStream object2CodeObjectOutputStream = new Object2CodeObjectOutputStream(
      byteArrayOutputStream); 
     object2CodeObjectOutputStream.writeObject(<your-java-bean>); 
     System.out.println(
       byteArrayOutputStream.toString()); 
0

Tiền phát hành lâu dài Persistence (java.beans.Encoder và bạn bè) có cả XMLEncoder và bộ mã hóa Java. Bạn có thể vẫn tải xuống ở đâu đó.

0

Tôi đã gặp sự cố tương tự gần đây và khung nhỏ testrecorder phát triển từ đó. Nó cũng hỗ trợ các đối tượng không tuân thủ các quy ước của Java Bean. Ví dụ bạn có serializable như thế này:

Map<String,Integer> m = new HashMap<String,Integer>(); 
m.put("bar",new Integer(21)); 

CodeSerializer codeSerializer = new CodeSerializer(); 
System.out.println(codeSerializer.serialize(m)); // of course you can put this string to a file output stream 

và đầu ra sẽ là:

HashMap map1 = new LinkedHashMap<>(); 
map1.put("foo", 21); 

Người ta có thể gọi serialize(Type, Object) để làm map1 một loại chung chung hơn (ví dụ Map hoặc Map<String, Integer>).

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