web-dev-qa-db-fra.com

Hibernate: impossible de désérialiser - en-tête de flux non valide

Des idées sur la façon dont je pourrais résoudre cette erreur? J'utilise Spring JPA avec Hibernate. Détails nécessaires ci-dessous.

Classe d'entité 1:

@Entity
@Table(name = "ways")
@TypeDef(name = "hstore", typeClass = HstoreUserType.class)
@Cacheable
public class Way {

    /**
     * Primary key for the row in table.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    /**
     * The ID to represent it across the system.
     * Used for preserving historical information. 
     */
    @Column(name = "way_id")
    private Long wayId;

    /**
     * The version of the way this Object represents. 
     */
    @Column(name = "version")
    private Integer version;


    /**
     * The {@link User} that edited this version. 
     */
    @OneToOne
    @PrimaryKeyJoinColumn(name = "user_id")
    private User user;

    /**
     * Timestamp when this version of the Way was edited.
     */
    @Column(name = "tstamp")
    @Temporal(TemporalType.TIMESTAMP)
    private Date timestamp;

    /**
     * The changeset that this version of the way belongs to. 
     */
    @Column(name = "changeset_id")
    private Long changesetId;

    /**
     * All the tags this Way contains. 
     */
    @Type(type = "hstore")
    @Column(name = "tags", columnDefinition = "hstore")
    private Object2ObjectOpenHashMap<String, String> tags = new Object2ObjectOpenHashMap<String, String>(); 

    @Column(name = "bbox")
    private Geometry bbox;

    @Column(name = "linestring")
    private Geometry linestring;

    @Column(name = "nodes")
    private Long[] nodes;

    // getters and setters
}

Classe d'entité pour l'utilisateur:

@Entity
@Table(name = "users")
@Cacheable
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name", unique = true)
    private String name;

    // getters and setters

}

Et le stacktrace:

Le stacktrace est assez énorme. Je colle tout le stacktrace ci-dessous pour référence et un rapide TL; DR ici:

javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize
Caused by: org.hibernate.type.SerializationException: could not deserialize
Caused by: Java.io.StreamCorruptedException: invalid stream header: 30313033

Le stacktrace complet suit:

javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize
        at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.Java:1361)
        at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.Java:1289)
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.Java:261)
        at org.hibernate.ejb.criteria.CriteriaQueryCompiler$3.getResultList(CriteriaQueryCompiler.Java:260)
        at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.Java:250)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:606)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFac
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySuppo
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.Java:110)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.Java:155)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
        at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeReava:92)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.Java:90)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.Java:202)
        at com.Sun.proxy.$Proxy36.findAll(Unknown Source)
        at com.osmrecommend.persistence.service.WayPersistenceServiceImpl.getAllWays(WayPersistenceServiceImpl.Java:32)
        at com.osmrecommend.dao.WayDAO.getAllWays(WayDAO.Java:37)
        at com.osmrecommend.cbf.TFIDFModelBuilder.get(TFIDFModelBuilder.Java:90)
        at com.osmrecommend.cbf.TFIDFModelBuilder.get(TFIDFModelBuilder.Java:36)
        at org.grouplens.grapht.util.MemoizingProvider.get(MemoizingProvider.Java:59)
        at org.grouplens.lenskit.inject.StaticInjector.instantiate(StaticInjector.Java:130)
        at org.grouplens.lenskit.inject.StaticInjector.apply(StaticInjector.Java:137)
        at org.grouplens.lenskit.inject.StaticInjector.apply(StaticInjector.Java:47)
        at org.grouplens.lenskit.eval.traintest.ComponentCache$NodeInstantiator.call(ComponentCache.Java:166)
        at com.google.common.cache.LocalCache$LocalManualCache$1.load(LocalCache.Java:4792)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.Java:3599)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.Java:2379)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.Java:2342)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.Java:2257)
        at com.google.common.cache.LocalCache.get(LocalCache.Java:4000)
        at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.Java:4789)
        at org.grouplens.lenskit.eval.traintest.ComponentCache$Instantiator.apply(ComponentCache.Java:126)
        at org.grouplens.lenskit.eval.traintest.ComponentCache$Instantiator.apply(ComponentCache.Java:104)
        at org.grouplens.lenskit.inject.RecommenderInstantiator$1.apply(RecommenderInstantiator.Java:109)
        at org.grouplens.lenskit.inject.RecommenderInstantiator$1.apply(RecommenderInstantiator.Java:99)
        at org.grouplens.lenskit.inject.RecommenderInstantiator.replaceShareableNodes(RecommenderInstantiator.Java:188)
        at org.grouplens.lenskit.inject.RecommenderInstantiator.instantiate(RecommenderInstantiator.Java:99)
        at org.grouplens.lenskit.eval.traintest.LenskitEvalJob.buildRecommender(LenskitEvalJob.Java:74)
        at org.grouplens.lenskit.eval.traintest.TrainTestJob.runEvaluation(TrainTestJob.Java:117)
        at org.grouplens.lenskit.eval.traintest.TrainTestJob.call(TrainTestJob.Java:101)
        at org.grouplens.lenskit.eval.traintest.JobGraph$JobNode.call(JobGraph.Java:116)
        at org.grouplens.lenskit.eval.traintest.JobGraph$JobNode.call(JobGraph.Java:102)
        at org.grouplens.lenskit.util.parallel.SequentialTaskGraphExecutor.execute(SequentialTaskGraphExecutor.Java:37)
        at org.grouplens.lenskit.eval.traintest.TrainTestEvalTask.runEvaluations(TrainTestEvalTask.Java:468)
        at org.grouplens.lenskit.eval.traintest.TrainTestEvalTask.perform(TrainTestEvalTask.Java:398)
        at org.grouplens.lenskit.eval.traintest.SimpleEvaluator.call(SimpleEvaluator.Java:313)
        at com.osmrecommend.app.OSMRecommendEval.main(OSMRecommendEval.Java:94)
Caused by: org.hibernate.type.SerializationException: could not deserialize
        at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.Java:262)
        at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.Java:306)
        at org.hibernate.type.descriptor.Java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.Java:131)
        at org.hibernate.type.descriptor.Java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.Java:117)
        at org.hibernate.type.descriptor.Java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.Java:39)
        at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.Java:67)
        at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.Java:65)
        at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.Java:269)
        at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.Java:265)
        at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.Java:238)
        at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.Java:357)
        at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.Java:2695)
        at org.hibernate.loader.Loader.loadFromResultSet(Loader.Java:1552)
        at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.Java:1484)
        at org.hibernate.loader.Loader.getRow(Loader.Java:1384)
        at org.hibernate.loader.Loader.getRowFromResultSet(Loader.Java:640)
        at org.hibernate.loader.Loader.doQuery(Loader.Java:856)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.Java:289)
        at org.hibernate.loader.Loader.doList(Loader.Java:2463)
        at org.hibernate.loader.Loader.doList(Loader.Java:2449)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.Java:2279)
        at org.hibernate.loader.Loader.list(Loader.Java:2274)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.Java:470)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.Java:355)
        at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.Java:196)
2014-04-13 17:35:49 INFO  persistence.service.WayPersistenceServiceImpl:37 - All ways fetched in 331s
        at org.hibernate.internal.SessionImpl.list(SessionImpl.Java:1115)
        at org.hibernate.internal.QueryImpl.list(QueryImpl.Java:101)
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.Java:252)
        ... 51 more
Caused by: Java.io.StreamCorruptedException: invalid stream header: 30313033
        at Java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.Java:804)
        at Java.io.ObjectInputStream.<init>(ObjectInputStream.Java:299)
        at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.Java:328)
        at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.Java:318)
        at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.Java:237)
        ... 78 more

PDATE:

J'ai mis à jour la classe d'entités Ways comme suit, mais l'erreur persiste:

@Entity
@Table(name = "ways")
@Cacheable
public class Way implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -7941769011539363185L;

    /**
     * Primary key for the row in table.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    /**
     * The ID to represent it across the system.
     * Used for preserving historical information. 
     */
    @Column(name = "way_id")
    private Long wayId;

    /**
     * The version of the way this Object represents. 
     */
    @Column(name = "version")
    private Integer version;


    /**
     * The {@link User} that edited this version. 
     */
    @OneToOne
    @PrimaryKeyJoinColumn(name = "user_id")
    private User user;

    /**
     * Timestamp when this version of the Way was edited.
     */
    @Column(name = "tstamp")
    @Temporal(TemporalType.TIMESTAMP)
    private Date timestamp;

    /**
     * The changeset that this version of the way belongs to. 
     */
    @Column(name = "changeset_id")
    private Long changesetId;

    /**
     * All the tags this Way contains. 
     */
    @Column(name = "tags")
    private String tags; 

    @Column(name = "bbox")
    private Geometry bbox;

    @Column(name = "linestring")
    private Geometry linestring;

    @Column(name = "nodes")
    @ElementCollection(targetClass=Long.class)
    private List<Long> nodes;
32
bcosynot

Ce problème se produit lorsque quelque chose ne peut pas être désérialisé (merci Capitaine Évident). Dans vos mappages d'entités, les éléments suivants semblent suspects:

@Type(type = "hstore")
@Column(name = "tags", columnDefinition = "hstore")
private Object2ObjectOpenHashMap<String, String> tags = new Object2ObjectOpenHashMap<String, String>(); 

@Column(name = "bbox")
private Geometry bbox;

@Column(name = "linestring")
private Geometry linestring;

Ma suggestion est de jeter un oeil sur Geometry et Object2ObjectHashMap classes - vérifie si elles sont sérialisables elles-mêmes et tous leurs champs sont aussi sérialisables, ou marqués avec le mot clé transient. De plus, si vous postez ces cours ici, cela peut également vous aider. La liste de classes HstoreUserType peut également être utile.

27
Alexey Malev

Pour les autres avec la même erreur (ne répond pas à cette question exacte)

J'ai rencontré cette erreur avec hibernate 4.3 et 5.0.5 en raison de champs de type Java.time.LocalDateTime J'ai plusieurs entités qui utilisent LocalDateTime, mais une seule d'entre elles est à l'origine du problème, je ne sais pas pourquoi.

Cela a été corrigé en ajoutant la dépendance suivante:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-Java8</artifactId>
    <version>${hibernate.version}</version>
</dependency>
61
molholm

En ce qui concerne le kaba713 answer et convertir Java.time.* par Hibernate.

J'utilise org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters; et cela fonctionne avec Spring-Boot 1.5.4.

@Column(name = "order_date", nullable = false)
@Convert(converter = Jsr310JpaConverters.LocalDateTimeConverter.class)
private LocalDateTime orderDate;

Et nous n'avons pas besoin d'écrire un convertisseur personnalisé.

9
Alexey Simonov

Le problème devrait concerner la relation géométrique, elle est mappée en tant que colonne régulière. Hibernate essaie donc de mapper une simple colonne sur un objet géométrique. J'avais un problème similaire et la solution consistait à définir explicitement la relation, quelque chose comme:

@OneToOne
@JoinColumn(name = "bbox")
private Geometry bbox;
8
Felipe Cadena

En ce qui concerne le réponse de @molholm, je vous déconseille d'utiliser une dépendance dépréciée. Le problème spécifique est que les versions antérieures d'Hibernate ne convertissaient pas Java.time.* par eux-mêmes, vous avez donc dû écrire un convertisseur. La dernière version (5.2.1.Final du 06/2016) semble avoir un convertisseur intégré. Mais je vous conseillerais quand même d'écrire le vôtre et de l'ajouter à votre attribut. C'est à dire.:

@Convert(converter = LocalDateConverter.class)
private LocalDate timestamp;

Et voici le convertisseur:

import Java.sql.Date;
import Java.time.LocalDate;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter
public class LocalDateConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate entityValue) {
        if (entityValue == null) {
            return null;
        }
        return Date.valueOf(entityValue);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date databaseValue) {
        if (databaseValue == null) {
            return null;
        }
        return databaseValue.toLocalDate();
    }
}
7
kaba713

Je faisais face à ceci sur un @NamedNativeQuery + @SqlResultSetMapping scénario. TargetClass de @ ConstructorResult avait un Enum personnalisé à l'intérieur. Le changer en String et le convertir plus tard en mon code a résolu le problème.

2
Anand Rockzz

La réponse d'Alexey Simonov fonctionne presque pour moi. Cependant, je suis toujours obligé d'utiliser Java 7 et j'utilise le backport Java.time de ThreeTen .

Dans mon cas, je viens d'utiliser un convertisseur différent, adapté aux classes de backport:

@Column(name = "lastupdate", nullable = false)
@Convert(converter = ThreeTenBackPortJpaConverters.LocalDateConverter.class)
private LocalDate lastUpdate;
2
Benjamín Valero

Assurez-vous que vos objets d'entité implémentent l'interface Serializable. Veuillez sélectionner l'option permettant de rendre vos objets sérialisables dans n'importe quel outil que vous utilisez.

Quelque chose comme ça

public class Way implements Serializable {
    private static final long serialVersionUID = 1L;
2
Surendra Poranki

Vos annotations de mappage d'entités (ou xml) ne correspondent pas à votre table de base de données. Donc, l'hydratation/la désérialisation a échoué.

Alors quelle colonne est le problème? Cela ne vous dit pas directement.

Un indice est le code hexadécimal à la fin, par exemple un en-tête de flux invalide: 53 ....

53 se trouve être le code ASCII pour "S". ( https://ascii.cl/ )

Vous pouvez obtenir l'hexagone comme ceci: select hex(MyColumn) from MyTable;

Vous pouvez donc regarder l'hex de colonnes suspectes jusqu'à ce que vous le trouviez.

En outre, vous pouvez supprimer les colonnes une par une du mappage d'entités (par exemple, commentez @Column et remplacez-le par @Transient) jusqu'à ce que cela fonctionne. Commencez par les éléments suspects, par exemple les enums ou les sérialiseurs personnalisés. Ou peut-être avec toutes les colonnes que vous venez d'ajouter qui auraient pu le casser.

1
Curtis Yallop

J'ai fait face à ce problème:

HTTP Status 500 - Request processing failed; nested exception is org.hibernate.type.SerializationException: could not deserialize

Vous avez également la solution.

Pour moi côté db quelques lignes entrées manuellement les données après avoir essayé de récupérer les données levées exception supprimée les lignes entrées manuellement après que cette a essayé de récupérer les données afin que cette fois pas d'exception. Cela signifie que vous insérez les entités sérialisées en mode hibernate dans la base de données. La base stocke le format des objets sérialisés et récupère les lignes de la base de données par des entités sérialisées.

1
user8495084

Ce type de problème est lié à la dépendance hibernate-spatiale du projet ou au dialecte hibernate dans le cas de la géométrie (dans Spring Boot, il s’agit de la propriété spring.jpa.database-platform)? Ça devrait aider.

1
Nimesh

Pour les autres avec le même problème où aucune des réponses précédentes n'a aidé à résoudre le problème:

TLDR : Vérifiez vos dépendances/bibliothèques référencées pour les doublons.

Le message d'erreur mentionné peut également s'afficher lorsqu'un projet contient déjà une version plus ancienne (ou identique) de la bibliothèque JTS vividsolutions/locationtech incluse, puis qu'ultérieurement hibernate-spatial a été ajouté au projet (livré avec sa propre dépendance de bibliothèque JTS ) Cela peut être particulièrement difficile à comprendre, quand hibernate-spatial réside dans un module différent (par exemple, osgi) et, par conséquent, aucun avertissement du compilateur n'indique les différentes versions de bibliothèque utilisées dans différentes parties de votre code.

Le code Sample du type d'objet "Geometry" faisant référence au démarreur de thread, la bibliothèque JTS (ou geolatte) a donc été très probablement utilisée, ce qui signifie également que l'hibernation spatiale a été très probablement utilisée.

0
user7563540

J'ai eu un problème similaire avec l'exception, mais la cause était légèrement différente pour moi. Dans la génération POJO, un type de données Oracle "TIMESTAMP (6) WITH TIME ZONE" est devenu un objet de type Serializable. Étant donné que cet attribut n'était pas pertinent pour moi, je l'ai simplement supprimé.

0
MavidDeyers