[ 
https://issues.apache.org/jira/browse/IGNITE-6200?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16164385#comment-16164385
 ] 

Alexandr Kuramshin commented on IGNITE-6200:
--------------------------------------------

When writing a serializable object by the {{OptimizedObjectOutputStream}} the 
following logic occurs:

1. Initial call to {{OptimizedObjectOutputStream.writeObject0}} will find 
{{OptimizedClassDescriptor}} and it's {{write}} consequently invokes 
{{OptimizedObjectOutputStream.writeSerializable}}

2. The {{writeSerializable}} initialize {{curObj}} to the serializable object 
instance and invokes its {{writeObject}} method.

3. If the implementations will call 
{{OptimizedObjectOutputStream.defaultWriteObject}} right away then no error 
occurs.

4. But if the implementation first call 
{{OptimizedObjectOutputStream.writeObject}} then {{curObj}} will be reset and 
consequent call causes the error.

{{org.dom4j.QName}} has the such implementation of {{writeObject}} method.

The fix is simple: store {{curObj}} reference at the start of 
{{OptimizedObjectOutputStream.writeObject0}}, and restore at the end.

> org.dom4j.QName can't be serialized
> -----------------------------------
>
>                 Key: IGNITE-6200
>                 URL: https://issues.apache.org/jira/browse/IGNITE-6200
>             Project: Ignite
>          Issue Type: Bug
>    Affects Versions: 2.1
>            Reporter: Alexei Scherbakov
>             Fix For: 2.3
>
>
> Exception:
> {noformat}
> class org.apache.ignite.binary.BinaryObjectException: Failed to marshal 
> object with optimized marshaller: org.dom4j.QName@364492 [name: test 
> namespace: "org.dom4j.Namespace@e20 [Namespace: prefix qq mapped to URI ""]"]
>       at 
> org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal0(BinaryWriterExImpl.java:186)
>       at 
> org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:147)
>       at 
> org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:134)
>       at 
> org.apache.ignite.internal.binary.GridBinaryMarshaller.marshal(GridBinaryMarshaller.java:248)
>       at 
> org.apache.ignite.internal.binary.BinaryMarshaller.marshal0(BinaryMarshaller.java:82)
>       at 
> org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.marshal(AbstractNodeNameAwareMarshaller.java:58)
>       at 
> org.apache.ignite.internal.processors.cache.MarshallerTest.test(MarshallerTest.java:160)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at 
> org.apache.ignite.testframework.junits.GridAbstractTest.runTestInternal(GridAbstractTest.java:2000)
>       at 
> org.apache.ignite.testframework.junits.GridAbstractTest.access$000(GridAbstractTest.java:132)
>       at 
> org.apache.ignite.testframework.junits.GridAbstractTest$5.run(GridAbstractTest.java:1915)
>       at java.lang.Thread.run(Thread.java:745)
> Caused by: class org.apache.ignite.IgniteCheckedException: Failed to 
> serialize object: org.dom4j.QName@364492 [name: test namespace: 
> "org.dom4j.Namespace@e20 [Namespace: prefix qq mapped to URI ""]"]
>       at 
> org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller.marshal0(OptimizedMarshaller.java:206)
>       at 
> org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.marshal(AbstractNodeNameAwareMarshaller.java:58)
>       at 
> org.apache.ignite.internal.util.IgniteUtils.marshal(IgniteUtils.java:9836)
>       at 
> org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal0(BinaryWriterExImpl.java:179)
>       ... 15 more
> Caused by: java.io.IOException: java.io.NotActiveException: Not in 
> writeObject() call.
>       at 
> org.apache.ignite.internal.marshaller.optimized.OptimizedObjectOutputStream.writeSerializable(OptimizedObjectOutputStream.java:324)
>       at 
> org.apache.ignite.internal.marshaller.optimized.OptimizedClassDescriptor.write(OptimizedClassDescriptor.java:827)
>       at 
> org.apache.ignite.internal.marshaller.optimized.OptimizedObjectOutputStream.writeObject0(OptimizedObjectOutputStream.java:224)
>       at 
> org.apache.ignite.internal.marshaller.optimized.OptimizedObjectOutputStream.writeObjectOverride(OptimizedObjectOutputStream.java:152)
>       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
>       at 
> org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller.marshal0(OptimizedMarshaller.java:201)
>       ... 18 more
> Caused by: java.io.NotActiveException: Not in writeObject() call.
>       at 
> org.apache.ignite.internal.marshaller.optimized.OptimizedObjectOutputStream.defaultWriteObject(OptimizedObjectOutputStream.java:684)
>       at org.dom4j.QName.writeObject(QName.java:239)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at 
> org.apache.ignite.internal.marshaller.optimized.OptimizedObjectOutputStream.writeSerializable(OptimizedObjectOutputStream.java:318)
>       ... 23 more
> {noformat}
> Reproducer:
> {noformat}
> public void test() throws Exception {
>         try {
>             IgniteEx ex = startGrid(0);
>             QName qName = new QName("test", new Namespace("qq", null), "q");
>             byte[] marshal = 
> ex.configuration().getMarshaller().marshal(qName);
>         } finally {
>             stopAllGrids();
>         }
>     }
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to