2010-09-17 15 views
44

Tôi cần chuyển đổi đối tượng thành byte [] để lưu trữ trong kho khóa-giá trị Nội các Tokyo. Tôi cũng cần unbyte byte [] vào một đối tượng khi đọc từ kho khóa-giá trị.Java: đối tượng thành byte [] và byte [] để chuyển đổi đối tượng (đối với Nội các Tokyo)

Có gói nào ngoài đó sẽ giúp tôi thực hiện tác vụ này không? Hay giải pháp tốt nhất để tự mình thực hiện?

+2

Tạo lớp học của bạn [Serializable] (http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html), sau đó sử dụng câu trả lời tại [ Java Serializable Object to Byte Array ] (http://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array). –

+0

nó không phải là một bản sao chính xác, mặc dù nó xuất hiện như vậy – Bozho

Trả lời

119
public static byte[] serialize(Object obj) throws IOException { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    ObjectOutputStream os = new ObjectOutputStream(out); 
    os.writeObject(obj); 
    return out.toByteArray(); 
} 
public static Object deserialize(byte[] data) throws IOException, ClassNotFoundException { 
    ByteArrayInputStream in = new ByteArrayInputStream(data); 
    ObjectInputStream is = new ObjectInputStream(in); 
    return is.readObject(); 
} 
+0

đừng quên gọi 'is.close' và' in.close'. –

+16

'is.close' và' in.close' không cần thiết trong trường hợp này vì nó là luồng trong bộ nhớ. Điều duy nhất nó sẽ làm ở đây là làm cho nó chậm hơn và tiết kiệm hơn. Nhưng tôi hiểu IDE có thể gắn cờ mã ở trên vì luồng không bị đóng. –

+3

Tôi không nghĩ rằng nó sẽ làm chậm hơn, nó chỉ là một phương pháp trống để chênh lệch thời gian phải rất thấp. Nhưng bạn đúng: 'Đóng một ByteArrayOutputStream không có hiệu lực.' [Java Doc] (http://docs.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#close%28%29) Tuyệt vời: D –

9

Nếu lớp học của bạn mở rộng Serializable, bạn có thể viết và đọc các đối tượng thông qua một ByteArrayOutputStream, đó là những gì tôi thường làm.

+3

Tất cả các loại được bao gồm dưới dạng biến trong lớp của bạn (và tất cả các loại trong các loại đó, vv) cũng cần phải được nối tiếp. –

+0

Thực ra anh ta sẽ cần một ObjectOutputStream để bọc BAOS ... Nhưng yeah, đó là cách dễ nhất để đi. –

+0

Tôi sẽ cân nhắc việc sử dụng một số thứ khác ngoài serialization được tích hợp sẵn của Java - JBoss serialization, JSerial, Avro, vv hoặc một định dạng XML như XStream hoặc Javolution marshalling cùng với gzip. Chuẩn serialization không phải là đặc biệt nhanh chóng, và mặc dù hiệu quả không gian biên của nó là tốt, có khá nhiều chi phí cho mỗi luồng. –

5

Bạn có thể xem cách Hector thực hiện việc này cho Cassandra, nơi mục tiêu là như nhau - chuyển đổi mọi thứ sang và từ byte[] để lưu trữ/truy xuất từ ​​cơ sở dữ liệu NoSQL - see here. Đối với các kiểu nguyên thủy (+ Chuỗi), có các Trình tuần tự đặc biệt, nếu không có số chung là ObjectSerializer (mong đợi Serializable và sử dụng ObjectOutputStream). Bạn có thể, tất nhiên, chỉ sử dụng nó cho tất cả mọi thứ, nhưng có thể có dư thừa siêu dữ liệu ở dạng tuần tự.

Tôi đoán bạn có thể sao chép toàn bộ gói và sử dụng nó.

6

Sử dụng serializedeserialize phương pháp trong SerializationUtils từ commons-lang.