दिलचस्प पोस्ट
एक 2 डी संख्यात्मक ऑब्जेक्ट सब्सकेटिंग समूह के द्वारा एकत्र किए जाने वाले मूल्यों को एकत्रित करने के लिए कैसे करें? आईओएफ (प्रबंधित एक्स्टेंसिबिलिटी फ्रेमवर्क) बनाम IoC / DI प्रत्येक 30 सेकंड में क्रोन चलाना मैं एंड्रॉइड एप्लिकेशन के ढेर के आकार के उपयोग को कैसे पहचानूं? रिवर्स ऑर्डर में लाइन द्वारा एक फ़ाइल लाइन पढ़ें अलग अल्पविराम से अलग किए गए मान और तालिका में एसक्यूएल सर्वर में स्टोर करें UIButton IOS7 में टैप पर हाइलाइट नहीं दिखा रहा है एंड्रॉइड: एक पृष्ठभूमि सेवा को जीवित रखना (प्रक्रिया मृत्यु को रोकना) ब्राउज़र बंद पर कुकीज़ साफ़ करें डेटाबेस डिजाइन में 1-to-1 संबंध का उपयोग करने की आवश्यकता है? PHP का उपयोग करते हुए ईमेल कैसे भेजें? नीचे के डॉट्स के साथ एंड्रॉइड व्यूपैगर पायथन अनुरोध पैकेज: XML प्रतिक्रिया को संभालना आईओएस शुरू पृष्ठभूमि थ्रेड

किसी स्ट्रिंग में ऑब्जेक्ट को सीरियल करना कैसे करें

मैं किसी ऑब्जेक्ट को किसी फ़ाइल में क्रमबद्ध करने में सक्षम हूं और फिर उसे फिर से पुनर्स्थापित कर रहा हूं जैसा कि अगले कोड स्निपेट में दिखाया गया है। मैं ऑब्जेक्ट को किसी स्ट्रिंग में सीरियल करना चाहूंगा और इसके बजाय एक डेटाबेस में स्टोर करना चाहता हूं। क्या कोई मेरी मदद कर सकता है?

LinkedList<Diff_match_patch.Patch> patches = // whatever... FileOutputStream fileStream = new FileOutputStream("foo.ser"); ObjectOutputStream os = new ObjectOutputStream(fileStream); os.writeObject(patches1); os.close(); FileInputStream fileInputStream = new FileInputStream("foo.ser"); ObjectInputStream oInputStream = new ObjectInputStream(fileInputStream); Object one = oInputStream.readObject(); LinkedList<Diff_match_patch.Patch> patches3 = (LinkedList<Diff_match_patch.Patch>) one; os.close(); 

Solutions Collecting From Web of "किसी स्ट्रिंग में ऑब्जेक्ट को सीरियल करना कैसे करें"

सर्जियो:

आपको ब्लॉब का उपयोग करना चाहिए यह जेडीबीसी के साथ काफी तेज है।

आपके द्वारा पोस्ट किए गए दूसरे कोड के साथ समस्या एन्कोडिंग है सुनिश्चित करें कि उनमें से कोई भी विफल हो जाने के लिए आपको इसके अलावा बाइट को एन्कोड करना चाहिए।

यदि आप अब भी इसे स्ट्रिंग में लिखना चाहते हैं तो आप java.util.Base64 का उपयोग करके बाइट को एन्कोड कर सकते हैं।

फिर भी आपको डेटा प्रकार के रूप में CLOB का उपयोग करना चाहिए क्योंकि आपको नहीं पता कि सीरिजलाइज्ड डाटा कितना समय तक होने वाला है।

यहां इसका उपयोग करने का एक नमूना है

 import java.util.*; import java.io.*; /** * Usage sample serializing SomeClass instance */ public class ToStringSample { public static void main( String [] args ) throws IOException, ClassNotFoundException { String string = toString( new SomeClass() ); System.out.println(" Encoded serialized version " ); System.out.println( string ); SomeClass some = ( SomeClass ) fromString( string ); System.out.println( "\n\nReconstituted object"); System.out.println( some ); } /** Read the object from Base64 string. */ private static Object fromString( String s ) throws IOException , ClassNotFoundException { byte [] data = Base64.getDecoder().decode( s ); ObjectInputStream ois = new ObjectInputStream( new ByteArrayInputStream( data ) ); Object o = ois.readObject(); ois.close(); return o; } /** Write the object to a Base64 string. */ private static String toString( Serializable o ) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream( baos ); oos.writeObject( o ); oos.close(); return Base64.getEncoder().encodeToString(baos.toByteArray()); } } /** Test subject. A very simple class. */ class SomeClass implements Serializable { private final static long serialVersionUID = 1; // See Nick's comment below int i = Integer.MAX_VALUE; String s = "ABCDEFGHIJKLMNOP"; Double d = new Double( -1.0 ); public String toString(){ return "SomeClass instance says: Don't worry, " + "I'm healthy. Look, my data is i = " + i + ", s = " + s + ", d = " + d; } } 

आउटपुट:

 C:\samples>javac *.java C:\samples>java ToStringSample Encoded serialized version rO0ABXNyAAlTb21lQ2xhc3MAAAAAAAAAAQIAA0kAAWlMAAFkdAASTGphdmEvbGFuZy9Eb3VibGU7T AABc3QAEkxqYXZhL2xhbmcvU3RyaW5nO3hwf////3NyABBqYXZhLmxhbmcuRG91YmxlgLPCSilr+w QCAAFEAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cL/wAAAAAAAAdAAQQUJ DREVGR0hJSktMTU5PUA== Reconstituted object SomeClass instance says: Don't worry, I'm healthy. Look, my data is i = 2147483647, s = ABCDEFGHIJKLMNOP, d = -1.0 

नोट : जावा 7 और उससे पहले के लिए आप यहां मूल उत्तर देख सकते हैं

कैसे FileOutputStream के बजाय एक बाइटअरेऑन आउटपुटस्ट्रीम को डेटा लिखने के बारे में?

अन्यथा, आप XMLEncoder का उपयोग कर ऑब्जेक्ट को सीरियल कर सकते हैं, XML को जारी रख सकते हैं, फिर XMLDecoder के द्वारा deserialize।

महान और त्वरित उत्तर के लिए धन्यवाद आपकी मदद के लिए मैं कुछ वोट दे दूँगा। मैंने आपके उत्तर के आधार पर मेरी राय में सबसे अच्छा समाधान कोडित किया है

 LinkedList<Patch> patches1 = diff.patch_make(text2, text1); try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bos); os.writeObject(patches1); String serialized_patches1 = bos.toString(); os.close(); ByteArrayInputStream bis = new ByteArrayInputStream(serialized_patches1.getBytes()); ObjectInputStream oInputStream = new ObjectInputStream(bis); LinkedList<Patch> restored_patches1 = (LinkedList<Patch>) oInputStream.readObject(); // patches1 equals restored_patches1 oInputStream.close(); } catch(Exception ex) { ex.printStackTrace(); } 

ध्यान दें कि मैंने JSON का उपयोग नहीं किया क्योंकि कम कुशल है

नोट: मैं आपकी सलाह के बारे में सोचता हूं कि सीरियललाइज्ड ऑब्जेक्ट को डेटाबेस में स्ट्रिंग के रूप में संग्रहीत नहीं बल्कि बाइट [] के बजाय

कैसे एक बूँद के रूप में वस्तु जारी रखने के बारे में

XStream XML से / से serializing / deserializing के लिए एक सरल उपयोगिता प्रदान करता है, और यह बहुत तेज़ है द्विआधारी ब्लॉब्स के बजाय XML CLOB भंडारण करना कम नाजुक होने वाला है, अधिक पठनीय होने का उल्लेख नहीं करना।

यदि आप ऑब्जेक्ट को डेटाबेस में बायनरी डेटा के रूप में संग्रहीत कर रहे हैं, तो आपको वास्तव में एक BLOB डेटाटाइप का उपयोग करना चाहिए। डाटाबेस इसे अधिक कुशलतापूर्वक स्टोर करने में सक्षम है, और आपको एन्कोडिंग और पसंद के बारे में चिंता करने की ज़रूरत नहीं है जेडीबीसी धाराओं के मामले में blobs बनाने और पुनः प्राप्त करने के तरीके प्रदान करता है। जावा 6 का उपयोग करें, यदि आप कर सकते हैं, तो जेडीबीसी एपीआई के लिए कुछ अतिरिक्त किए गए जो कि ब्लॉब्स से निपटने के लिए बहुत आसान है।

यदि आपको डेटा को स्ट्रिंग के रूप में संग्रहित करने की आवश्यकता है, तो मैं एक्स- XMLEncoder को XML- आधारित संग्रहण ( XMLEncoder तुलना में बहुत आसान) के लिए XMLEncoder , लेकिन वैकल्पिक ऑब्जेक्ट प्रस्तुतियां उतनी उपयोगी हो सकती हैं (जैसे JSON)। आपका दृष्टिकोण इस बात पर निर्भर करता है कि आपको वास्तव में इस तरह वस्तु को स्टोर करने की आवश्यकता क्यों है।

धारावाहिक स्ट्रीम केवल बाइट्स का एक अनुक्रम (ओकटेट) है। तो सवाल यह है कि कैसे एक बाइट के अनुक्रम को स्ट्रिंग में कनवर्ट करें, और फिर से वापस। इसके अलावा इसे वर्ण कोडों के एक सीमित सेट का उपयोग करने की आवश्यकता होती है, अगर यह एक डेटाबेस में संग्रहीत होने वाला है।

समस्या का स्पष्ट समाधान क्षेत्र को एक द्विआधारी LOB में बदलने के लिए है यदि आप एक चरस लोब के साथ रहना चाहते हैं, तो आपको कुछ योजनाओं जैसे base64, hex या uu में सांकेतिक शब्दों में बदलना होगा।

आप कक्षाओं में निर्माण का उपयोग कर सकते हैं sun.misc.Base64Decoder और sun.misc.Base64Encoder को श्रृंखलाबद्ध करने के लिए बाइनरी डेटा को स्ट्रिंग में कनवर्ट करना। आप दास को अतिरिक्त कक्षाओं की आवश्यकता नहीं है क्योंकि यह इनका निर्माण होता है

जावा.sql.PreparedStatement वर्ग, विशेष रूप से समारोह पर एक नज़र डालें

http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setBinaryStream(int,%20java.io.InputStream)

फिर java.sql पर एक नज़र डालें। ResultSet वर्ग, विशेष रूप से समारोह

http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getBinaryStream(int)

ध्यान रखें कि यदि आप किसी ऑब्जेक्ट को किसी डेटाबेस में क्रमबद्ध कर रहे हैं, और फिर आप अपने कोड में एक नया संस्करण में ऑब्जेक्ट को बदलते हैं, तो deserialization प्रक्रिया आसानी से विफल हो सकती है क्योंकि आपके ऑब्जेक्ट के हस्ताक्षर में बदल दिया गया है। मैंने एक बार यह गलती एक कस्टम वरीयताओं को संचयित करने के साथ बनाई है और फिर वरीयता परिभाषा में बदलाव कर रहा है। अचानक मैं पहले से कोई सीरिजलाइज्ड जानकारी नहीं पढ़ सकता था।

आप एक तालिका में प्रति संपत्ति कॉलम के लिए क्लूनी लिखकर और ऑब्जेक्ट संस्करणों और डिसेराइलाइजेशन के साथ इस मुद्दे से बचने के बजाय ऑब्जेक्ट को इस तरीके से बना और कमजोर कर सकते हैं। या गुणों को किसी प्रकार के हैम्पप में लिखना, जैसे java.util.Properties ऑब्जेक्ट, और फिर गुणों को क्रमबद्ध करना जो ऑब्जेक्ट को बदलने की अत्यंत संभावना नहीं है

आप UUEncoding का उपयोग कर सकते हैं

जावा 8 दृष्टिकोण, ऑब्जेक्ट को / से स्ट्रिंग में बदलने, ऑस्कररिज से जवाब से प्रेरित है। डी / एन्कोडिंग के लिए, java.util.Base64 आवश्यक है और इसका उपयोग किया जाता है।

 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Base64; import java.util.Optional; interface ObjectHelper { static Optional<String> convertToString(final Serializable object) { try (final ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(object); return Optional.of(Base64.getEncoder().encodeToString(baos.toByteArray())); } catch (final IOException e) { e.printStackTrace(); return Optional.empty(); } } static <T extends Serializable> Optional<T> convertFrom(final String objectAsString) { final byte[] data = Base64.getDecoder().decode(objectAsString); try (final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data))) { return Optional.of((T) ois.readObject()); } catch (final IOException | ClassNotFoundException e) { e.printStackTrace(); return Optional.empty(); } } } 

सरल समाधान, मेरे लिए काम किया

 public static byte[] serialize(Object obj) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(out); os.writeObject(obj); return out.toByteArray(); } 

ओ / आर फ्रेमवर्क का प्रयोग करें जैसे हाइबरनेट