최대 절전 모드:역직렬화할 수 없음 - 잘못된 스트림 헤더
이 오류를 해결할 수 있는 방법에 대한 아이디어가 있습니까?저는 Hibernate와 함께 Spring JPA를 사용하고 있습니다.아래에 필요한 세부사항이 있습니다.
엔티티 클래스 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
@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
}
그리고 스택 추적:
스택 트레이스는 상당히 큽니다.참고 및 빠른 TL을 위해 아래 전체 스택 추적을 붙여드립니다.DR 위치:
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
업데이트:
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;
동일한 오류가 있는 다른 사용자의 경우(이 정확한 질문에 대답하지 않음)
4 이 했습니다.java.time.LocalDateTime
LocalDateTime을 사용하는 엔티티가 여러 개 있는데 그 중 한 개만 문제를 일으켰습니다. 이유를 모르겠습니다.
다음과 같은 종속성을 추가하여 수정되었습니다.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
이 문제는 무언가를 역직렬화할 수 없을 때 발생합니다(감사합니다, 명백한 선장님).엔티티 매핑에서 다음 사항이 의심스러운 것으로 보입니다.
@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
수업 목록도 도움이 될 수 있습니다.
kaba713 답변 및 변환 관련java.time.*
최대 절전 모드입니다.
사용합니다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;
그리고 우리는 커스텀 컨버터를 작성할 필요가 없습니다.
문제는 지오메트리 관계에 대한 것이어야 합니다. 지오메트리 관계는 정규 열로 매핑되므로 최대 절전 모드에서는 간단한 열을 지오메트리 개체에 매핑하려고 합니다.저도 비슷한 문제가 있었는데, 그 해결책은 다음과 같은 관계를 명확하게 정의하는 것이었습니다.
@OneToOne
@JoinColumn(name = "bbox")
private Geometry bbox;
@molholm의 답변과 관련하여, 저는 더 이상 사용하지 않는 종속성을 사용하지 말라고 조언하고 싶습니다.구체적인 문제는 이전 버전의 최대 절전 모드가 변환되지 않았다는 것입니다.java.time.*
그들 스스로, 그래서 당신은 변환기를 써야 했습니다.최신 버전(5.2.1).Final from 2016)에는 통합 컨버터가 있는 것 같습니다.하지만 저는 여전히 독자적으로 작성하여 속성에 추가하는 것이 좋습니다.예:
@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();
}
}
나는 이것을 마주하고 있었습니다.@NamedNativeQuery
+@SqlResultSetMapping
@@ConstructorResult의 대상 클래스에 사용자 지정 열거형이 있습니다.String으로 변경하고 나중에 내 코드로 변환하면 문제가 해결되었습니다.
도면요소 매핑 주석(또는 xml)이 DB 테이블과 일치하지 않습니다.그래서 수화/직렬화에 실패했습니다.
그렇다면 어느 칼럼이 문제일까요?그것은 당신에게 직접적으로 말해주지 않습니다.
한 가지 단서는 endeg의 16진수 코드입니다. 잘못된 스트림 헤더: 53...
53은 "S"의 아스키 코드입니다. (https://ascii.cl/)
은 다음과 수 .select hex(MyColumn) from MyTable;
그래서 여러분은 그것을 찾을 때까지 의심스러운 열들의 육각형을 볼 수 있습니다.
또한 작동할 때까지 도면요소 매핑에서 열을 하나씩 제거할 수 있습니다(예: 주석 @Column 및 @Transient로 대체).의심스러운 유전자 또는 사용자 지정 일련 번호부터 시작합니다.아니면 방금 추가한 열로 인해 깨졌을 수도 있습니다.
엔티티 개체가 직렬화 가능 인터페이스를 구현하고 있는지 확인하십시오.사용 중인 도구에서 개체를 직렬화할 수 있도록 하는 옵션을 선택하십시오.
이런 거.
public class Way implements Serializable {
private static final long serialVersionUID = 1L;
이 문제에 직면했습니다.
HTTP Status 500 - Request processing failed; nested exception is org.hibernate.type.SerializationException: could not deserialize
해결책도 있습니다.
medb 측의 경우 데이터를 검색하려고 시도한 후 일부 행이 수동으로 입력한 데이터 예외를 삭제한 후 수동으로 입력한 행이 데이터를 검색하려고 시도했으므로 이번에는 예외가 없습니다.db 저장소에서 최대 절전 모드를 통해 데이터 직렬화된 엔티티를 삽입하는 경우를 의미합니다. Db는 직렬화된 개체 형식을 저장하고 직렬화된 엔티티를 통해 db 행을 검색합니다.
알렉세이 시모노프의 대답은 저에게 거의 효과가 있습니다.하지만 저는 여전히 Java 7을 사용해야 하고 ThreeTen의 java.time backport를 사용하고 있습니다.
저의 경우, 백포트된 클래스에 적합한 다른 컨버터를 방금 사용했습니다.
@Column(name = "lastupdate", nullable = false)
@Convert(converter = ThreeTenBackPortJpaConverters.LocalDateConverter.class)
private LocalDate lastUpdate;
프로젝트에 대한 최대 절전 모드 공간 종속성 또는 기하학의 경우 최대 절전 모드 방언과 관련된 이러한 유형의 문제(Spring Boot에서는 spring.jpa.database-platform 속성)?도움이 될 겁니다.
저도 예외적으로 비슷한 문제가 있었지만, 저는 그 원인이 조금 달랐습니다.유형 "TIME stamp ZONE"은 POJO 유형의 .Serializable
이 속성은 저와 관련이 없기 때문에 그냥 제거했습니다.
이전 답변이 문제를 해결하는 데 도움이 되지 않는 동일한 문제를 가진 다른 사람의 경우:
TLDR: 종속성/참조 라이브러리에서 중복 항목을 확인합니다.
언급된 오류 메시지는 프로젝트에 일부 오래된(또는 동일한) 버전의 생생한 솔루션/로케이션 기술 JTS 라이브러리가 이미 포함되어 있고 나중에 최대 절전 모드 공간이 프로젝트에 추가된 경우에도 표시될 수 있습니다(자체 JTS 라이브러리 종속성과 함께 제공됨).이것은 특히 최대 절전 모드 공간이 다른 모듈(예: osgi)에 있으므로 코드의 다른 부분에서 사용 중인 다른 라이브러리 버전을 보여주는 컴파일러 경고가 없을 때 확인하기 어려울 수 있습니다.
스레드 스타터의 샘플 코드는 객체 유형 "Geometry"를 참조하므로 JTS(또는 Geolate) 라이브러리가 사용되었을 가능성이 매우 높으며, 이는 또한 동면 공간이 사용되었을 가능성이 가장 높다는 것을 의미합니다.
이와 유사한 문제에 대해 30분 정도 시간을 할애했습니다. 이 문제의 원인은 다음과 같습니다. java.io .스트림 손상예외: 잘못된 스트림 헤더: 30313033.동면 상태에 있는 니블에 게시된 이 솔루션은 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
일반적으로 이것이 범인인 경우 최대 절전 모드 로그 정보 수준에서 확인할 수 있습니다.
HHH000400을 찾습니다.그럴 것 같네요.Using dialect: org.hibernate.spatial.dialect.postgis.PostgisDialect
올바른 설정을 위해
이 오류는 여러 가지 이유 또는 가능한 시나리오로 인해 발생할 수 있습니다. 분리하는 가장 좋은 방법은 Hibernate LOG 수준을 원본 소스에 INFO로 설정하는 것입니다.
최근에 이 오류가 발생했습니다. 이는 JPA 엔티티 속성에 적용되지 않는 문자열 변환기에 대한 사용자 지정 JSON이 있기 때문입니다.
만약 당신이 이것에 갇히게 된다면 또 다른 특이점일 뿐입니다.제 경우 IDE는 java.security를 자동으로 가져올 수 있습니다.java.sql 대신 타임스탬프를 지정합니다.타임스탬프 - 후자는 직렬화할 수 있습니다.
OP에 따른 역추적과 아래의 오류를 확인하였습니다.흐흐흐.
StreamCorruptedException: invalid stream header: 78690512
형님, 이 오류는 이미 저에게 발생했습니다. 변수 유형이 DB 열 데이터 유형과 일치하지 않기 때문에 발생했습니다.
샘플: MySQL 스키마에 (INT) 유형의 'age' 행이 있습니다.
코드의 식별자 '나이'가 (숫자) 유형이며, '직렬화 오류'를 해결하려면 (정수) 유형이어야 합니다.
여러분, 이 문제를 해결할 수 있기를 바랍니다.
언급URL : https://stackoverflow.com/questions/23049498/hibernate-could-not-deserialize-invalid-stream-header
'programing' 카테고리의 다른 글
SQLFiddle에서 PL/SQL을 얻는 방법은 무엇입니까? (0) | 2023.08.05 |
---|---|
동일한 ID에 대한 제한이 있는 선택 (0) | 2023.08.05 |
더 작은 크기로 재할당을 호출하면 나머지가 해방된다고 가정할 수 있습니까? (0) | 2023.08.05 |
도커: 상위 디렉토리에서 파일 추가 (0) | 2023.08.05 |
메인 스레드에서 메서드를 호출하시겠습니까? (0) | 2023.08.05 |