Java: Objekt zu Byte[] und byte[] zum Objektkonverter (für Tokyo Cabinet)

Lesezeit: 3 Minuten

Java Objekt zu Byte und byte zum Objektkonverter fur Tokyo
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

1642309508 75 Java Objekt zu Byte und byte zum Objektkonverter fur Tokyo
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.

Java Objekt zu Byte und byte zum Objektkonverter fur Tokyo
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);

1642309508 314 Java Objekt zu Byte und byte zum Objektkonverter fur Tokyo
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?

.

501070cookie-checkJava: Objekt zu Byte[] und byte[] zum Objektkonverter (für Tokyo Cabinet)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy