I was getting the following Exception, which did not make sense as the deSerialization test passed OK.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
org.springframework.orm.hibernate3.HibernateSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize | |
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:692) | |
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) |
I have a domain object that I had proved through a unit test that I could serialize & deserialize successfully.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Test | |
public void testDeserialize() throws Exception | |
{ | |
CrmConfirmationReference srcRef = createConfirmationRef(); | |
byte[] copy = SerializationUtils.serialize(srcRef); | |
CrmConfirmationReference deSerialized = (CrmConfirmationReference)SerializationUtils.deserialize(copy); | |
assertEquals("Oooops, not the same", srcRef), deSerialized); | |
} |
My domain object contained the following object which if I removed then worked OK:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) | |
@JoinColumns({ | |
@JoinColumn(name = "MPRN", nullable = false), | |
@JoinColumn(name = "EFFECTIVE_FROM", nullable = false) | |
}) | |
@NotNull | |
public CrmMprn getMprn() | |
{ | |
return mprn; | |
} |
But tomcat & my integration test were both failing with the following Exception.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
org.springframework.orm.hibernate3.HibernateSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize | |
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:692) | |
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) | |
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:412) | |
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:375) | |
at org.springframework.orm.hibernate3.HibernateTemplate.loadAll(HibernateTemplate.java:585) | |
at uk.co.utilisoft.crm350.dao.CrmGenericDao$1.doInHibernate(CrmGenericDao.java:82) | |
at uk.co.utilisoft.crm350.dao.CrmGenericDao$1.doInHibernate(CrmGenericDao.java:1) | |
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:407) | |
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339) | |
at uk.co.utilisoft.crm350.dao.CrmGenericDao.getAll(CrmGenericDao.java:78) | |
at uk.co.utilisoft.crm350.dao.CrmConfirmationReferenceIntegrationTest.testSerialize(CrmConfirmationReferenceIntegrationTest.java:26) | |
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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) | |
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | |
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) | |
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) | |
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) | |
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) | |
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) | |
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) | |
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) | |
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) | |
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) | |
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) | |
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) | |
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) | |
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) | |
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) | |
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) | |
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) | |
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) | |
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) | |
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) | |
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) | |
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) | |
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) | |
Caused by: org.hibernate.type.SerializationException: could not deserialize | |
at org.hibernate.util.SerializationHelper.doDeserialize(SerializationHelper.java:262) | |
at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:306) | |
at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.java:130) | |
at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:116) | |
at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:39) | |
at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:62) | |
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64) | |
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253) | |
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249) | |
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:229) | |
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:330) | |
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2283) | |
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1527) | |
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1455) | |
at org.hibernate.loader.Loader.getRow(Loader.java:1355) | |
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:611) | |
at org.hibernate.loader.Loader.doQuery(Loader.java:829) | |
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) | |
at org.hibernate.loader.Loader.doList(Loader.java:2533) | |
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) | |
at org.hibernate.loader.Loader.list(Loader.java:2271) | |
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119) | |
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716) | |
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347) | |
at org.springframework.orm.hibernate3.HibernateTemplate$5.doInHibernate(HibernateTemplate.java:591) | |
at org.springframework.orm.hibernate3.HibernateTemplate$5.doInHibernate(HibernateTemplate.java:585) | |
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:407) | |
... 36 more | |
Caused by: java.io.StreamCorruptedException: invalid stream header: 31323334 | |
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804) | |
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) | |
at org.hibernate.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:328) |
It turns out I had missed out an annotation, obvious really but I could not spot the error & the Exception was totally misleading. What had I missed? The '@manyToOne' annotation. Twit.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@ManyToOne(fetch = FetchType.LAZY) | |
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) | |
@JoinColumns({ | |
@JoinColumn(name = "MPRN", nullable = false), | |
@JoinColumn(name = "EFFECTIVE_FROM", nullable = false) | |
}) | |
@NotNull | |
public CrmMprn getMprn() | |
{ | |
return mprn; | |
} |