Hibernate: Could not deserialize - invalid stream header
Any ideas as to how I could resolve this error? I am using Spring JPA with Hibernate. Necessary details below.
Entity class 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
}
Entity class for User:
@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
}
And the stacktrace :
The stacktrace is quite huge. I am pasting the whole stacktrace below for reference and a quick TL;DR here:
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
Full stacktrace follows:
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
UPDATE:
I updated the Ways entity class to the following, but error still occurs :
@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;
Solution 1:
For others with the same error (does not answer this exact question)
I experienced this error with hibernate 4.3 and 5.0.5 due to fields of type java.time.LocalDateTime
, I have several entities using LocalDateTime, but only one of them caused the issue, I don't know why.
It was fixed by adding the following dependency:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
Solution 2:
This issue is happening when something cannot be deserialized (thank you, Captain Obvious). In your entity mappings the following looks suspicious:
@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;
My suggestion is either to take a look over Geometry
and Object2ObjectHashMap
classes - check whether they are serializable itself and all their fields either serializable too, or marked with transient
keyword. Also if you post these classes here, this may help aswell. HstoreUserType
class listing may also be helpful.