Java: Objekt zu Byte[] und byte[] zum Objektkonverter (für Tokyo Cabinet)
Lesezeit: 3 Minuten
volni
Ich muss Objekte in ein Byte konvertieren[] im Schlüssel-Wert-Speicher des Tokyo Cabinet gespeichert werden. Ich muss auch das Byte entbyten[] zu einem Objekt, wenn aus dem Schlüsselwertspeicher gelesen wird.
Gibt es Pakete, die mir bei dieser Aufgabe helfen? Oder wäre die beste Lösung, es selbst zu implementieren?
Machen Sie Ihre Klasse Serialisierbar, dann verwenden Sie die Antwort bei [ Java Serializable Object to Byte Array ](stackoverflow.com/questions/2836646/…).
– Matthäus Flaschen
17. September 10 um 14:14 Uhr
es ist kein exaktes Duplikat, obwohl es so aussieht
– Bozo
17. September 10 um 14:21 Uhr
Wenn das Objekt aber nicht serialisierbar ist Teilbar oder ein Paket, können Sie verwenden Marschall und unmarshall Methoden, siehe (stackoverflow.com/a/18000094/9160102)
– Bruno L.
29. September 19 um 7:12 Uhr
Thomas Müller
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();
}
Anrufen nicht vergessen is.close und in.close.
– Cacho-Weihnachtsmann
29. Mai 13 um 23:27 Uhr
is.close und in.close werden in diesem Fall nicht benötigt, da es sich um einen In-Memory-Stream handelt. Das einzige, was es hier tun würde, wäre, es langsamer und ausführlicher zu machen. Aber ich verstehe, dass die IDE den obigen Code markieren könnte, weil der Stream nicht geschlossen ist.
– Thomas Müller
30. Mai 13 um 6:56 Uhr
Ich glaube nicht, dass es langsamer wird, es ist nur eine leere Methode, also muss der Zeitunterschied sehr gering sein. Aber Sie haben Recht: Closing a ByteArrayOutputStream has no effect.Java-Doc Genial 😀
– Cacho-Weihnachtsmann
30. Mai ’13 um 16:32 Uhr
Was ist, wenn das zu serialisierende Objekt vom Typ InputStream ist?
– Arthur Eirich
5. Januar 15 um 11:02 Uhr
@ThomasMueller Leider “os.writeObject(obj);” würde eine NotSerializableException verursachen, da InputStream die Serializable-Schnittstelle nicht implementiert =(
– Arthur Eirich
5. Januar 15 um 14:20 Uhr
Wenn sich Ihre Klasse erweitert Serializable, können Sie Objekte über a schreiben und lesen ByteArrayOutputStream, das mache ich meistens.
Alle Typen, die als Variablen in Ihrer Klasse enthalten sind (und alle Typen in diesen Typen usw.), müssen ebenfalls serialisierbar sein.
– Dekan J
17. September 10 um 14:19 Uhr
Eigentlich braucht er auch einen ObjectOutputStream, um das BAOS zu packen … Aber ja, das ist der einfachste Weg.
– Aviad Ben Dov
17. September 10 um 14:23 Uhr
Ich würde auch in Betracht ziehen, etwas anderes als die integrierte Serialisierung von Java zu verwenden – JBoss-Serialisierung, JSerial, Avro usw. oder ein XML-Format wie XStream oder Javolution-Marshalling plus gzip. Die Standard-Serialisierung ist nicht besonders schnell, und obwohl die marginale Platzeffizienz gut ist, gibt es ziemlich viel Overhead pro Stream.
– Tom Anderson
17. September 10 um 16:28 Uhr
Benutzen serialize und deserialize Methoden ein SerializationUtils von commons-lang.
Bozo
Sie können sich ansehen, wie Hector dies für Cassandra macht, wobei das Ziel dasselbe ist – alles in und aus konvertieren byte[] zum Speichern/Abrufen aus einer NoSQL-Datenbank – siehe hier. Für die primitiven Typen (+String) gibt es spezielle Serializer, ansonsten gibt es die generischen ObjectSerializer (erwartet Serializable, und verwenden ObjectOutputStream). Sie können natürlich für alles nur es verwenden, aber es könnten redundante Metadaten in der serialisierten Form vorhanden sein.
Ich denke, Sie können das gesamte Paket kopieren und verwenden.
Sie können ObjectMapper verwenden
ObjectMapper objectMapper = new ObjectMapper();
ObjectClass object = objectMapper.readValue(data, ObjectClass.class);
klobig
Wenn Sie nicht serialisieren möchten, können Sie den Objektmapper verwenden
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
ByteArrayOutputStream out = new ByteArrayOutputStream();
objectMapper.writeValue(out,obj);
byte[] data = out.toByteArray();
Wann sollten wir die Serializable-Schnittstelle implementieren?
.
5010700cookie-checkJava: Objekt zu Byte[] und byte[] zum Objektkonverter (für Tokyo Cabinet)yes
Machen Sie Ihre Klasse Serialisierbar, dann verwenden Sie die Antwort bei [ Java Serializable Object to Byte Array ](stackoverflow.com/questions/2836646/…).
– Matthäus Flaschen
17. September 10 um 14:14 Uhr
es ist kein exaktes Duplikat, obwohl es so aussieht
– Bozo
17. September 10 um 14:21 Uhr
Wenn das Objekt aber nicht serialisierbar ist Teilbar oder ein Paket, können Sie verwenden Marschall und unmarshall Methoden, siehe (stackoverflow.com/a/18000094/9160102)
– Bruno L.
29. September 19 um 7:12 Uhr