Спящий режим: невозможно десериализовать - неверный заголовок потока

Любые идеи относительно того, как я могу решить эту ошибку? Я использую Spring JPA с Hibernate. Необходимые детали ниже.

Класс сущности 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 для пользователя:

@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

}

И стек:

Стоп-трасса довольно огромная. Я вставляю весь stacktrace ниже для справки и быстрый TL; здесь:

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

Полный стек:

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:

Я обновил класс сущности Ways до следующего, но ошибка все еще происходит:

@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;

Ответы

Ответ 1

Эта проблема происходит, когда что-то нельзя десериализовать (спасибо, капитан Очевидный). В ваших сопоставлениях объектов выглядит подозрительно:

@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;

Мое предложение - либо взглянуть на классы Geometry и Object2ObjectHashMap - проверить, сериализуются ли они сами и все их поля либо сериализуемые, либо помечены ключевым словом transient. Также, если вы разместите эти классы здесь, это также может помочь. HstoreUserType также может быть полезен список классов.

Ответ 2

Для других с одинаковой ошибкой (не отвечает на этот точный вопрос)

Я испытал эту ошибку с hibernate 4.3 и 5.0.5 из-за полей типа java.time.LocalDateTime, у меня есть несколько объектов, использующих LocalDateTime, но только одна из них вызвала проблему, я не знаю почему.

Он был исправлен путем добавления следующей зависимости:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>${hibernate.version}</version>
</dependency>

Ответ 3

Относительно ответа kaba713 и преобразования java.time.* с помощью Hibernate.

Я использую org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters; и работает с Spring -Boot 1.5.4.

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

И нам не нужно писать собственный конвертер.

Ответ 4

Проблема должна быть связана с отношением Geometry, она отображается как регулярный столбец, поэтому Hibernate пытается сопоставить простой столбец с объектом Geometry. У меня была аналогичная проблема, и решение заключалось в объяснении отношения, например:

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

Ответ 5

Что касается ответа от @molholm, я бы посоветовал не использовать устаревшую зависимость. Конкретная проблема заключается в том, что более ранние версии Hibernate не преобразовывали java.time.* самими, поэтому вам пришлось написать конвертер. Последняя версия (5.2.1.Final от 06/2016), кажется, имеет интегрированный преобразователь. Но я бы посоветовал вам написать свой собственный и добавить его в свой атрибут. I.e.:

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

И вот конвертер:

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();
    }
}

Ответ 6

Пожалуйста, убедитесь, что объекты объекта реализуют интерфейс Serializable. Выберите вариант, чтобы сделать ваши объекты Сериализуемыми в любом инструменте, который вы используете.

Что-то вроде этого

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

Ответ 7

Я столкнулся с этим в сценарии @NamedNativeQuery + @SqlResultSetMapping. В targetClass @ConstructorResult был встроенный пользовательский Enum. Изменение его в String и последующее преобразование его в мой код устранили проблему.

Ответ 8

Ответ от Алексея Симонова почти работает для меня. Однако я все еще вынужден использовать Java 7 и использую бэкпорт java.time из ThreeTen.

В моем случае я только что использовал другой конвертер, подходящий для классов с переносом:

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

Ответ 9

Я столкнулся с этой проблемой:

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

Получено также решение.

Для меня db side некоторые строки , введенные вручную, данные после попытки получить исключенное из данных исключение удалили введенные вручную строки после того, как попытались получить данные, поэтому на этот раз не было исключений. Значит, если вы вставляете данные в сериализованные объекты через hibernate в db, сохраните его.  Db хранит формат последовательных объектов и извлекает строки db через сериализованные объекты.

Ответ 10

Ваши аннотации сопоставления сущностей (или xml) не соответствуют вашей таблице БД. Таким образом, гидратация/десериализация не удалась.

Так в каком столбце проблема? Это не говорит вам напрямую.

Одна подсказка - шестнадцатеричные коды в конце например, неверный заголовок потока: 53....

53 - это код ascii для "S". (https://ascii.cl/)

Вы можете получить гекс следующим образом: select hex(MyColumn) from MyTable;

Таким образом, вы можете посмотреть на гекс подозрительных столбцов, пока не найдете его.

Кроме того, вы можете удалить столбцы один за другим из отображения сущности (например, закомментировать @Column и заменить его @Transient), пока он не заработает. Начните с подозрительных, например, перечислений или пользовательских сериализаторов. Или, возможно, с какими-то столбцами, которые вы только что добавили, которые могли бы сломаться.

Ответ 11

Этот тип проблемы связан с hibernate-пространственной зависимостью от проекта или связан с hibernate-диалектом в случае геометрии (в Spring Boot это свойство spring.jpa.database-platform)? Это должно помочь.

Ответ 12

У меня была похожая проблема с исключением, но причина была немного другой для меня. В поколении POJO тип данных Oracle "TIMESTAMP (6) WITH TIME ZONE" стал объектом типа Serializable. Поскольку этот атрибут не был актуален для меня, я просто удалил его.

Ответ 13

Для других с той же проблемой, где ни один из предыдущих ответов не помог решить проблему:

TLDR: проверьте ваши зависимости/библиотеки на наличие дубликатов.

Упомянутое сообщение об ошибке также может отображаться, когда в проект уже включена более старая (или такая же) версия библиотеки JTS vividsolutions/locationtech, а затем в проект добавлен hibernate-пространственный (который поставляется с собственной зависимостью библиотеки JTS).). Это может быть особенно трудно понять, когда hibernate-пространственный находится в другом модуле (например, osgi) и, следовательно, никакие предупреждения компилятора не показывают разные версии библиотеки, используемые в разных частях вашего кода.

Пример кода средства запуска потока ссылается на тип объекта "Геометрия", поэтому, скорее всего, использовалась библиотека JTS (или geolatte), что также означает, что наиболее вероятно, что использовался hibernate-пространственный.

Ответ 14

Я потратил 30 минут на эту похожую проблему. Причина: java.io.StreamCorruptedException: неверный заголовок потока: 30313033. Это решение, опубликованное в hibernate-пространственном Nibble, помогло мне http://hibernate-spatial.1140993.n2.nabble.com/exception-disabling-contexual-lob-creation-tp7572477p7572484.html.

Мужчина уверен, что вы поставили spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisDialect На месте ##spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

Обычно, если это виновник, вы узнаете в журналах Hibernate INFO Level

Ищите HHH000400: Должно быть Using dialect: org.hibernate.spatial.dialect.postgis.PostgisDialect для правильной настройки.