मैं वस्तुओं को क्रमबद्ध करने के लिए जावा Serializable
इंटरफ़ेस और ObjectOutputStream
का उपयोग कर रहा हूं (अब तक, यह विधि मेरे उद्देश्यों के लिए पर्याप्त है)।क्या सीरियलाइजेशन ऑब्जेक्ट पहचान को संरक्षित करता है?
मेरा एपीआई कुछ परिचालनों के लिए ऑब्जेक्ट पहचान पर निर्भर करता है और मुझे आश्चर्य है कि यह क्रमबद्धता द्वारा संरक्षित किया जाएगा या नहीं। यह कहना है: यदि दो मनमाने ढंग से ऑब्जेक्ट्स a
और b
के लिए, यह क्रमशः a == b
सेरियलाइजेशन से पहले है, क्या यह अभी भी deserialization के बाद पकड़ता है?
मुझे कुछ ग्रंथ मिले हैं जो claim the contrary - लेकिन उन्होंने या तो जेआरई के पुराने संस्करण के बारे में लिखा (मुझे केवल 1.6 और शायद 1.5 में दिलचस्पी है), या आरएमआई से संबंधित थे (जो मेरे लिए प्रासंगिक नहीं है)।
documentation ऑब्जेक्ट पहचान के संबंध में बहुत जल्द नहीं है। Sun.com पर technical article का उल्लेख है कि ObjectOutputStream
ऑब्जेक्ट्स पर कैशिंग का उपयोग करता है, जो मुझे केवल तभी समझ में आता है जब वस्तु पहचान वास्तव में संरक्षित होती है लेकिन मुझे इस भद्दा सबूत पर भरोसा करने के लिए पर्याप्त विश्वास नहीं है।
मैं इसे बाहर की कोशिश की है (जावा 1.6, ओएस एक्स) और पाया कि हाँ, वस्तुओं की पहचान क्रमबद्धता द्वारा अपरिवर्तित रहता है। लेकिन क्या मैं इन परिणामों से बाहर निकल सकता हूं या वे अविश्वसनीय हैं?
C----------+
| b1 b2 |
+----------+
| |
v v
B---+ B---+
| a | | a |
+---+ +---+
\ /
\/
\/
A----+
| |
+----+
एक न्यूनतम reproducing कोड:
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);
}
}
यदि यह एक == बी धारण करता है तो वे मनमानी वस्तुओं नहीं हैं। मेरा मानना है कि आपका प्रश्न संदर्भों के लिए जाता है। –