J'ai un objet de type X que je veux convertir en tableau d'octets avant de l'envoyer à stocker dans S3. Quelqu'un peut-il me dire comment faire cela? J'apprécie ton aide.
Ce que vous voulez faire s'appelle " sérialisation ". Il y a plusieurs façons de le faire, mais si vous n'avez besoin de rien d'extraordinaire, je pense que l'utilisation de standard Java) suffirait.
Peut-être que vous pourriez 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 à cela. Pas du tout au fait que vous ne pouvez lire/écrire qu'un seul objet par tableau d'octets, ce qui peut être ou ne pas être ce que vous voulez.
Notez que "Seuls les objets prenant en charge le Java.io.Serializable
l’interface peut être écrite dans les flux "(voir Java.io.ObjectOutputStream
).
Comme vous pourriez le rencontrer, l’allocation et le redimensionnement continus de Java.io.ByteArrayOutputStream
pourrait s'avérer être tout à fait le goulot de la bouteille. En fonction de votre modèle de thread, vous pouvez envisager de réutiliser certains objets.
Pour la sérialisation d'objets qui n'implémentent pas l'interface Serializable
, vous devez également écrire votre propre sérialiseur, par exemple, à l'aide des méthodes read */write * de Java.io.DataOutputStream
et les méthodes get */put * de Java.nio.ByteBuffer
peut-être en même temps que la réflexion ou une dépendance vis-à-vis de tiers.
Ce site présente une liste et une comparaison des performances de certains frameworks de sérialisation. En regardant les API, il semble que Kryo puisse répondre à vos besoins.
Utilisez les méthodes serialize
et deserialize
dans SerializationUtils
de commons-lang .
Ouais. Il suffit d'utiliser sérialisation binaire . Vous devez avoir chaque objet utiliser implements Serializable
mais c'est simple à partir de là.
Votre autre option, si vous souhaitez éviter d'implémenter l'interface Serializable, consiste à utiliser les réflexions, les données en lecture et en écriture depuis/vers un tampon en utilisant le processus 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 .
Comme je l'ai mentionné dans d'autres questions similaires, vous pouvez envisager de compresser les données en tant que valeur par défaut Java est un bit prolixe. Pour ce faire, vous placez un objet GZIPInput/OutputStream entre l'objet. ruisseaux et les ruisseaux Byte.
Pour convertir l'objet en un tableau d'octets , utilisez le concept de Serialization and De-serialization
.
La conversion complète d'un objet à un tableau d'octets expliquée dans est un 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?