J'ai un objet de type X que je veux convertir en tableau d'octets avant de l'envoyer pour le stocker dans S3. Quelqu'un peut-il me dire comment faire ? Je vous remercie de votre aide.
Réponses
Trop de publicités?Ce que vous voulez faire s'appelle " sérialisation ". Il y a plusieurs façons de procéder, mais si vous n'avez pas besoin de quelque chose de sophistiqué, je pense que l'utilisation de la balise sérialisation standard des objets Java ferait très bien l'affaire.
Vous pourriez peut-être utiliser quelque chose comme ça ?
package com.example;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Serializer {
public static byte[] serialize(Object obj) throws IOException {
try(ByteArrayOutputStream b = new ByteArrayOutputStream()){
try(ObjectOutputStream o = new ObjectOutputStream(b)){
o.writeObject(obj);
}
return b.toByteArray();
}
}
public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
try(ByteArrayInputStream b = new ByteArrayInputStream(bytes)){
try(ObjectInputStream o = new ObjectInputStream(b)){
return o.readObject();
}
}
}
}
Plusieurs améliorations peuvent être apportées à ce système. Notamment le fait que vous ne pouvez lire/écrire qu'un seul objet par tableau d'octets, ce qui n'est pas forcément ce que vous voulez.
Notez que "Seuls les objets qui prennent en charge l'option java.io.Serializable
peuvent être écrits dans des flux" (voir java.io.ObjectOutputStream
).
Comme vous risquez de le rencontrer, l'allocation et le redimensionnement continus des java.io.ByteArrayOutputStream
pourrait s'avérer être un véritable goulot d'étranglement. En fonction de votre modèle de filetage, vous pourriez envisager de réutiliser certains des objets.
Pour la sérialisation d'objets qui n'implémentent pas la fonction Serializable
vous devez soit écrire votre propre sérialiseur, par exemple en utilisant les méthodes de lecture*/écriture* de l'interface java.io.DataOutputStream
et les méthodes get*/put* de java.nio.ByteBuffer
peut-être en même temps que la réflexion, ou en faisant appel à la dépendance d'un tiers.
Ce site propose une liste et une comparaison des performances de certains cadres de sérialisation. En regardant les API, il semble que Kryo pourrait correspondre à ce dont vous avez besoin.
Utilice serialize
y deserialize
méthodes en SerializationUtils
de commons-lang .
Ouais. Utilisez juste sérialisation binaire . Vous devez faire en sorte que chaque objet utilise implements Serializable
mais c'est simple à partir de là.
L'autre option, si vous voulez éviter de mettre en œuvre l'interface Serializable, est d'utiliser la réflexion et de lire et écrire des données dans un tampon en utilisant un processus comme celui ci-dessous :
/**
* Sets all int fields in an object to 0.
*
* @param obj The object to operate on.
*
* @throws RuntimeException If there is a reflection problem.
*/
public static void initPublicIntFields(final Object obj) {
try {
Field[] fields = obj.getClass().getFields();
for (int idx = 0; idx < fields.length; idx++) {
if (fields[idx].getType() == int.class) {
fields[idx].setInt(obj, 0);
}
}
} catch (final IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
Source : .
Pour convertir le à un tableau d'octets utiliser le concept de Serialization and De-serialization
.
L'intégralité conversion d'un objet en tableau d'octets expliqué dans ce tutoriel.
Q. How can we convert object into byte array?
Q. How can we serialize a object?
Q. How can we De-serialize a object?
Q. What is the need of serialization and de-serialization?