La sérialisation personnalisée de la classe échoue

Andreas Mennel

J'ai une classe où je stocke des informations sur les fichiers (chemin, etc.). Je ne sérialise la classe que lorsque je veux envoyer les fichiers et autres informations à une autre personne.

Là, j'ai un problème avec les fichiers de plus de 1019 octets: ils ne sont pas stockés correctement.

J'ai pu recréer le problème avec cet exemple de classe:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerializableImage implements Serializable{
    private static final long serialVersionUID = -2079629440538093893L;
    private String path;
    private byte[] data;


    public SerializableImage()
    {}

    public SerializableImage(String path) {
        this.path = path;
    }

    public byte[] getData() {
        return data;
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        int imageSize = ois.readInt();
        data = new byte[imageSize];
        ois.read(data);
    }

    private void writeObject(ObjectOutputStream oos) throws IOException {
        int imageSize;
        File file = new File(path);
        imageSize = (int) file.length();
        oos.writeInt(imageSize);
        InputStream is = null;
        byte[] buffer = new byte[imageSize];

        try {
            is = new FileInputStream(file);
            is.read(buffer);
        } finally {
            if (is != null) {
                is.close();
            }
        }

        oos.write(buffer);
    }
}

L'attribut imageSize est écrit de la bonne manière, et les octets sont également lus dans le tampon de la bonne manière (comparé au "clonage de fichier" avec juste un FileInputStream et un FileOutputStream, donc je sais que les informations écrites dans le tableau d'octets du tampon sont correctes) .

La question est maintenant: y a-t-il un problème avec le oos.write (tampon)? Ou est le problème dans le ois.read (data)? imageSize est écrit / lu de la bonne manière.

J'ai toujours des valeurs erronées dans le tableau d'octets de données à partir de l'index 1020.

J'ai "testé" cette classe avec ce code:

    SerializableImage sourceImage = new SerializableImage("C:\\\\source.jpg");
    File serializableData = new File("C:\\\\data.data");
    File targetImage = new File("C:\\\\target.jpg");

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serializableData));
    oos.writeObject(sourceImage);

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(serializableData));

    sourceImage = (SerializableImage) ois.readObject();
    FileOutputStream imageOutputStream = new FileOutputStream(targetImage);

    byte[] data = sourceImage.getData();
    imageOutputStream.write(data);
    imageOutputStream.flush();
    ois.close();
    oos.close();
    imageOutputStream.close();

Y a-t-il quelque chose d'évident que je n'ai pas reconnu? Je ne reçois pas de message d'erreur ou quelque chose. La seule façon de le remarquer est que l'image cible n'est pas valide.

Andreas Mennel

Comme Robert l'a indiqué dans les commentaires sous la question, writeObject doit toujours être utilisé lorsque vous travaillez avec un ObjectOutputStream. Ecrire également (byte [] data) accepterait un tableau d'octets. Il en va de même pour la lecture avec readObject et read.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

RDD construit à partir de la classe de cas analysée: la sérialisation échoue

La connexion sécurisée échoue lors de l'ajout d'une classe ILogger personnalisée

Sérialisation de la configuration personnalisée

La désérialisation de Servicebustrigger échoue

Sérialisation de la classe personnalisée à l'aide de GSON

Désérialisation: récupérez les données de la classe personnalisée

La sérialisation personnalisée d'un dictionnaire échoue lorsque xml a une indentation / un saut de ligne

La sérialisation GSON échoue avec des objets personnalisés

La méthode __getitem__ de la classe de liste personnalisée échoue

La désérialisation de la goyave facultative <long> échoue

C# JSON Sérialisation personnalisée de la classe, y compris les attributs des membres/propriétés

C # InvokeMethod échoue après la sérialisation de Newtonsoft

extension de la classe Java sérialisation

Sérialisation de la classe interne statique

java - invocation de la désérialisation standard dans la désérialisation personnalisée

Sérialisation par le concepteur de la structure personnalisée

Prise en charge de la sérialisation par défaut pour une classe personnalisée dans un type imbriqué

La classe personnalisée avec IXmlSerializable échoue avec OutOfMemoryException

La sérialisation binaire Java échoue à cause de jackson

La désérialisation Jackson de String échoue

La désérialisation de Json dans List<long> échoue

la définition de la classe de sérialisation conditionnelle supprime la classe de sérialisation personnalisée pour une action supplémentaire dans le cadre de repos de Django

La sérialisation / désérialisation de Cosmos DB RequestOptions échoue avec NewtonSoft JsonConvert

Booster la sérialisation de la classe dérivée du modèle

Désérialisation de la classe abstraite Jackson basée sur la valeur du paramètre

Annotation personnalisée Jackson pour la sérialisation de valeur NULL personnalisée

Renommer la classe lors de la sérialisation en XML

Empêcher la sérialisation de la classe parent Java

classe primitive ignorée lors de la sérialisation de la classe générée par xsd

TOP liste

  1. 1

    Comment utiliser HttpClient avec TOUT cert ssl, quelle que soit la « mauvaise » est

  2. 2

    Comment afficher du texte au milieu de div avec une couleur d'arrière-plan différente?

  3. 3

    Résultat de l'échantillonneur JMeter : comprendre le temps de chargement, le temps de connexion et la latence

  4. 4

    Modbus Python Schneider PM5300

  5. 5

    Pourquoi Object.hashCode () ne suit pas la convention du code Java

  6. 6

    Comment faire une recherche partielle et obtenir un score pertinent dans Elasticsearch

  7. 7

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  8. 8

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  9. 9

    optimiser les opérations du serveur avec elasticsearch: traitement des filigranes de disque bas

  10. 10

    Comment changer la couleur de la police dans R?

  11. 11

    Autocomplete avec java, Redis, Recherche élastique, Mongo

  12. 12

    MasterService d'ElasticSearch prend trop de temps pour calculer l'état du cluster et lancer ProcessClusterEventTimeoutException

  13. 13

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  14. 14

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  15. 15

    Comment analyser un hachage Ruby plat en un hachage imbriqué?

  16. 16

    Comment créer une nouvelle application dans Dropbox avec des autorisations complètes

  17. 17

    Quelque chose dans le cluster Elasticsearch 7.4 devient de plus en plus lent avec les délais de lecture de temps en temps

  18. 18

    Ajustement non linéaire avec R

  19. 19

    php ajouter et fusionner des données de deux tables

  20. 20

    Exporter la table de l'arborescence vers CSV avec mise en forme

  21. 21

    帶有 Spring Boot 和 Azure AD 的 KeyCloak

chaudétiquette

Archive