You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sd...@apache.org on 2022/01/11 23:56:47 UTC

[ignite-3] 19/27: - marshal null correctly

This is an automated email from the ASF dual-hosted git repository.

sdanilov pushed a commit to branch uos-network
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 369541338e36d81b1fdf0132e8f73e4b8b4f51b7
Merge: 7b4063e 67c494a
Author: Roman Puchkovskiy <ro...@gmail.com>
AuthorDate: Tue Jan 11 15:47:35 2022 +0400

    - marshal null correctly

 .../marshal/DefaultUserObjectMarshaller.java            | 17 ++++++++---------
 .../DefaultUserObjectMarshallerWithBuiltinsTest.java    | 10 ++++++++++
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --cc modules/network/src/main/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshaller.java
index c9828bb,64c4e17..bc2617c
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshaller.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshaller.java
@@@ -133,16 -126,6 +133,19 @@@ public class DefaultUserObjectMarshalle
          return !builtInNonContainerMarshallers.supports(descriptor.clazz());
      }
  
 +    private ClassDescriptor obtainOriginalDescriptor(@Nullable Object object, Class<?> declaredClass) {
-         // object class is not a subclass of the declared class for primitives
-         // for enums we don't need the specific classes at all
-         Class<?> classToQueryForOriginalDescriptor = isInstanceOfSubclass(object, declaredClass)
-                 && !(object instanceof Enum)
-                 ? object.getClass() : declaredClass;
++        if (object == null) {
++            return descriptorRegistry.getNullDescriptor();
++        }
++
++        // For primitives we need to keep the declaredClass (it differs from object.getClass()).
++        // For enums we don't need the specific classes at all.
++        Class<?> classToQueryForOriginalDescriptor = declaredClass.isPrimitive() || object instanceof Enum
++                ? declaredClass : object.getClass();
 +
 +        return getOrCreateDescriptor(classToQueryForOriginalDescriptor);
 +    }
 +
      private boolean objectIsMemberOfEnumWithAnonymousClassesForMembers(Object object, Class<?> declaredClass) {
          return declaredClass.isEnum() && object.getClass().getSuperclass() == declaredClass;
      }
@@@ -195,10 -185,10 +198,6 @@@
          }
      }
  
--    private boolean isInstanceOfSubclass(@Nullable Object object, Class<?> maybeSuperclass) {
--        return object != null && maybeSuperclass.isAssignableFrom(object.getClass());
--    }
--
      @Nullable
      private Object applyWriteReplace(Object originalObject, ClassDescriptor originalDescriptor) throws MarshalException {
          try {
diff --cc modules/network/src/test/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshallerWithBuiltinsTest.java
index 438dd44,68d2557..5658b5a
--- a/modules/network/src/test/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshallerWithBuiltinsTest.java
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshallerWithBuiltinsTest.java
@@@ -106,6 -105,15 +107,15 @@@ class DefaultUserObjectMarshallerWithBu
      }
  
      @Test
+     void marshalsAndUnmarshalsNullThrowable() throws Exception {
+         MarshalledObject marshalled = marshaller.marshal(null, Throwable.class);
+ 
 -        Throwable unmarshalled = marshaller.unmarshal(marshalled.bytes(), descriptorRegistry);
++        Throwable unmarshalled = marshaller.unmarshal(marshalled.bytes(), descriptors);
+ 
+         assertThat(unmarshalled, is(nullValue()));
+     }
+ 
+     @Test
      void marshalsObjectArrayUsingExactlyDescriptorsOfObjectArrayAndComponents() throws Exception {
          MarshalledObject marshalled = marshaller.marshal(new Object[]{42, "abc"});