2010-05-14 18 views
214

को Serializable वस्तु मान लीजिए कि मैं एक serializable वर्ग AppMessage करते हैं।जावा बाइट सरणी

मैं इसे byte[] के रूप में सॉकेट पर दूसरी मशीन पर ट्रांसमिट करना चाहता हूं जहां इसे प्राप्त बाइट से पुनर्निर्मित किया जाता है।

मैं इसे कैसे प्राप्त कर सकता हूं?

+1

'बाइट []' क्यों? क्यों न केवल 'ऑब्जेक्टऑटपुटस्ट्रीम' के साथ सॉकेट पर इसे लिखें, और इसे 'ऑब्जेक्ट इनपुट स्ट्रीम' के साथ पढ़ें? – EJP

+0

@wuhaochi क्या आपको * वास्तव में * ऑब्जेक्टऑटपुटस्ट्रीम.writeObject() 'और' ObiectInputStream.readObject() 'का उदाहरण चाहिए? – EJP

उत्तर

327

तैयार बाइट्स भेजने के लिए:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ObjectOutput out = null; 
try { 
    out = new ObjectOutputStream(bos); 
    out.writeObject(yourObject); 
    out.flush(); 
    byte[] yourBytes = bos.toByteArray(); 
    ... 
} finally { 
    try { 
    bos.close(); 
    } catch (IOException ex) { 
    // ignore close exception 
    } 
} 

बाइट्स से वस्तु बनाएँ:

ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes); 
ObjectInput in = null; 
try { 
    in = new ObjectInputStream(bis); 
    Object o = in.readObject(); 
    ... 
} finally { 
    try { 
    if (in != null) { 
     in.close(); 
    } 
    } catch (IOException ex) { 
    // ignore close exception 
    } 
} 
+4

यह एक पूर्ण उत्तर नहीं है, यह सिर्फ 'सीरियलज़ेबल' वर्ग को बाइट सरणी में बदलने के तरीके को बताता है लेकिन प्रश्न स्वयं आरएमआई, ऑब्जेक्ट निर्माण और डिज़ाइनस्ट्रक्शन, क्रमबद्ध तंत्र और संस्करण इत्यादि सहित पूरे विषय को शामिल करता है। – Esko

+32

ऐसा नहीं है मैंने सवाल पढ़ा। मेरे लिए ऐसा लगता है कि उसकी समस्या यह है कि ऑब्जेक्ट को बाइट में कैसे परिवर्तित करें [] - इसे कैसे भेजा जाए। –

+1

टेलर: हाँ आपको यह सही मिला। मैं ऑब्जेक्ट को बाइट [] में बदलना चाहता हूं और इसे प्रेषित करना चाहता हूं। क्या आप कृपया इस बाइट [] को किसी ऑब्जेक्ट में कैसे चालू करें के बारे में कोड प्रदान कर सकते हैं? – iTEgg

233

सबसे अच्छा तरीका यह अपाचे Commons Lang से SerializationUtils उपयोग करने के लिए है क्या करना है।

को क्रमानुसार करने के लिए:

byte[] data = SerializationUtils.serialize(yourObject); 

deserialize करने के लिए:

YourObject yourObject = SerializationUtils.deserialize(data) 

के रूप में उल्लेख किया है, यह जरूरी है कॉमन्स लैंग पुस्तकालय। यह Gradle का उपयोग कर आयात किया जा सकता:

compile 'org.apache.commons:commons-lang3:3.5' 

Maven:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> 
<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons-lang3</artifactId> 
    <version>3.5</version> 
</dependency> 

Jar file

और अधिक तरीकों वैकल्पिक रूप से उल्लेख किया here

, पूरे संग्रह आयात किया जा सकता।

private byte[] convertToBytes(Object object) throws IOException { 
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutput out = new ObjectOutputStream(bos)) { 
     out.writeObject(object); 
     return bos.toByteArray(); 
    } 
} 

और दूसरी तरह के आसपास:

private Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException { 
    try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 
     ObjectInput in = new ObjectInputStream(bis)) { 
     return in.readObject(); 
    } 
} 
+49

अतिरिक्त ओवरहेड जोड़ा गया है? इस बिंदु पर पहिया को पुनर्निर्माण भी कर सकते हैं। गंभीरता से, यह एक लाइनर को समझना और संभावित त्रुटियों को कम करना अधिक आसान है (जैसे सही समय पर स्ट्रीम बंद नहीं करना और क्या नहीं)। – ALOToverflow

+0

यह सटीक प्रश्न पर 99% अन्य उत्तरों के विपरीत यह सरल और सीधा है। –

+0

मैंने आपके उत्तर, यूरी का उपयोग किया और मुझे समझ में नहीं आ रहा है कि मुझे "java.io.StreamCorruptedException: अवैध स्ट्रीम हेडर: 3C3F786D" क्यों मिल रहा है? –

59

आप जावा> = 7 का उपयोग करते हैं, तो आप स्वीकार कर लिया समाधान try with resources का उपयोग कर बेहतर बना सकते हैं , ApacheUtils द्वारा serialize & deserialize विधि द्वारा के रूप में @uris जवाब में कहा गया है, बाइट [] और उपाध्यक्ष प्रतिकूल करने के लिए वस्तु कन्वर्ट करने के लिए। लिंक पर deserializing :: Download org-apache-commons-lang.jar

को

Object object = (Object) SerializationUtils.deserialize(byte[] data) 

क्लिक करें द्वारा

byte[] data = SerializationUtils.serialize(object); 

परिवर्तित करने के लिए बाइट [] आपत्ति उठाने:

serializing द्वारा बाइट [] के लिए एक वस्तु को बदलने के लिए एकीकृत ।क्लिक करके जार फ़ाइल:

फ़ाइल का नाम ->ओपन Medule सेटिंग ->निर्भरता - ->अपने मॉड्यूल का चयन करें>जार फ़ाइल जोड़ें और आप किया जाता है।

उम्मीद है कि यह में मदद करता है।

संबंधित मुद्दे