Tôi đang sử dụng giao diện Java Serializable
và ObjectOutputStream
để sắp xếp các đối tượng (cho đến bây giờ, phương pháp này đã đủ cho các mục đích của tôi).Việc tuần tự hóa có duy trì nhận dạng đối tượng không?
API của tôi dựa vào nhận dạng đối tượng cho một số hoạt động và tôi tự hỏi liệu nó có được bảo tồn theo tuần tự hóa hay không. Đó là để nói: nếu, đối với hai đối tượng tùy ý a
và b
, nó giữ a == b
trước khi tuần tự hóa, nó vẫn giữ sau khi deserialization?
Tôi đã tìm thấy một số văn bản claim the contrary - nhưng họ đã viết về phiên bản cũ hơn của JRE (Tôi chỉ quan tâm đến 1.6 và có thể 1.5) hoặc quan tâm đến RMI (không liên quan đến tôi)).
documentation không phải là rất sắp tới về nhận dạng đối tượng. Một technical article trên sun.com đề cập rằng ObjectOutputStream
sử dụng bộ nhớ đệm trên các đối tượng, mà đối với tôi chỉ có ý nghĩa nếu nhận dạng đối tượng thực sự được giữ nguyên nhưng tôi không đủ tự tin để dựa vào bằng chứng mỏng manh này.
Tôi đã thử nó ra (Java 1.6, OS X) và thấy rằng có, danh tính của đối tượng vẫn không thay đổi bởi serialization. Nhưng tôi có thể ngoại suy từ những kết quả này hay chúng không đáng tin cậy?
Đối với thử nghiệm của tôi, tôi đã đăng đồ thị đối tượng sau đây:
C----------+
| b1 b2 |
+----------+
| |
v v
B---+ B---+
| a | | a |
+---+ +---+
\ /
\/
\/
A----+
| |
+----+
Một mã sinh sản tối thiểu:
import java.io.*;
public class SerializeTest {
static class A implements Serializable {}
static class B implements Serializable {
final A a;
public B(A a) {
this.a = a;
}
}
static class C implements Serializable {
final B b1, b2;
public C() {
A object = new A();
b1 = b2 = new B(object);
}
}
public static void main(String[] args) throws IOException,
ClassNotFoundException {
C before = new C();
System.out.print("Before: ");
System.out.println(before.b1.a == before.b2.a);
// Serialization.
ByteArrayOutputStream data = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(data);
out.writeObject(before);
out.close();
// Deserialization.
ObjectInputStream in =
new ObjectInputStream(new ByteArrayInputStream(data.toByteArray()));
C after = (C) in.readObject();
System.out.print("After: ");
System.out.println(after.b1.a == after.b2.a);
}
}
Nếu nó giữ rằng == b thì chúng không phải là đối tượng tùy ý. Tôi tin rằng câu hỏi của bạn đi cho các tài liệu tham khảo. –