dubbo icon indicating copy to clipboard operation
dubbo copied to clipboard

[Bug] use record class error

Open lkhuge opened this issue 1 year ago • 3 comments

Pre-check

  • [X] I am sure that all the content I provide is in English.

Search before asking

  • [X] I had searched in the issues and found no similar issues.

Apache Dubbo Component

Java SDK (apache/dubbo)

Dubbo Version

Dubbo Java 3.3.1

Steps to reproduce this issue

use:

public interface Test1Service {
    void execute(Test1Request request);
}

public record Test1Request(
        String p1,
        Integer p2,
        Boolean p3,
        LocalDateTime p4
) implements Serializable {
}

result: (error in server(Deserializer) )

Caused by: java.lang.UnsupportedOperationException: can't get field offset on a record class: private final java.lang.String com.test.service.dto.Test1Request.p1
	at jdk.unsupported/sun.misc.Unsafe.objectFieldOffset(Unsafe.java:648)
	at com.alibaba.com.caucho.hessian.io.FieldDeserializer2FactoryUnsafe$StringFieldDeserializer.<init>(FieldDeserializer2FactoryUnsafe.java:434)
	at com.alibaba.com.caucho.hessian.io.FieldDeserializer2FactoryUnsafe.create(FieldDeserializer2FactoryUnsafe.java:146)
	at com.alibaba.com.caucho.hessian.io.UnsafeDeserializer.getFieldMap(UnsafeDeserializer.java:366)
	at com.alibaba.com.caucho.hessian.io.UnsafeDeserializer.<init>(UnsafeDeserializer.java:109)
	at org.apache.dubbo.common.serialize.hessian2.Hessian2SerializerFactory.getDefaultDeserializer(Hessian2SerializerFactory.java:76)
	at com.alibaba.com.caucho.hessian.io.SerializerFactory.loadDeserializer(SerializerFactory.java:545)
	at com.alibaba.com.caucho.hessian.io.SerializerFactory.getDeserializer(SerializerFactory.java:474)
	at com.alibaba.com.caucho.hessian.io.SerializerFactory.getObjectDeserializer(SerializerFactory.java:672)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2954)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2289)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2218)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2262)
	at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2218)
	at org.apache.dubbo.common.serialize.hessian2.Hessian2ObjectInput.readObject(Hessian2ObjectInput.java:118)
	at org.apache.dubbo.common.serialize.DefaultSerializationExceptionWrapper$ProxyObjectInput.readObject(DefaultSerializationExceptionWrapper.java:161)

What you expected to happen

support record class

Anything else

dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java

    @Override
    protected Deserializer getDefaultDeserializer(Class cl) {
        try {
            // pre-check if class is allow
            defaultSerializeClassChecker.loadClass(getClassLoader(), cl.getName());
        } catch (ClassNotFoundException e) {
            // ignore
        }

        checkSerializable(cl);

        if (isEnableUnsafeSerializer()) {
            return new UnsafeDeserializer(cl, getFieldDeserializerFactory());
        } else return new JavaDeserializer(cl, getFieldDeserializerFactory());
    }

hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java

    protected Deserializer getDefaultDeserializer(Class cl) {
        if (InputStream.class.equals(cl))
            return InputStreamDeserializer.DESER;

        if (!Serializable.class.isAssignableFrom(cl)
                && !_isAllowNonSerializable) {
            throw new IllegalStateException("Serialized class " + cl.getName() + " must implement java.io.Serializable");
        }

        if (RecordUtil.isRecord(cl))
            return new RecordDeserializer(cl, _fieldDeserializerFactory);

        if (_isEnableUnsafeSerializer) {
            return new UnsafeDeserializer(cl, _fieldDeserializerFactory);
        } else
            return new JavaDeserializer(cl, _fieldDeserializerFactory);
    }

Are you willing to submit a pull request to fix on your own?

  • [ ] Yes I am willing to submit a pull request on my own!

Code of Conduct

lkhuge avatar Oct 22 '24 01:10 lkhuge

Can you please provide a demo? I cannot reproduce it.

image

Or have you ever configure the hessian-lite version. Hessian-lite 4.x has improved the compability with Record

AlbumenJ avatar Oct 22 '24 08:10 AlbumenJ

This problem is not caused by Hessian-lite but by dubco-serialization-hessian2

Can you please provide a demo? I cannot reproduce it.

image

Or have you ever configure the hessian-lite version. Hessian-lite 4.x has improved the compability with Record

lkhuge avatar Oct 22 '24 08:10 lkhuge

You can compare

https://github.com/apache/dubbo/blob/3.3/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java

and

https://github.com/apache/dubbo-hessian-lite/blob/master/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java

for

protected Deserializer getDefaultDeserializer(Class cl)

dubco-serialization-hessian2 is missing

        if (RecordUtil.isRecord(cl))
            return new RecordDeserializer(cl, _fieldDeserializerFactory);

lkhuge avatar Oct 22 '24 08:10 lkhuge

Got it. Will be fixed in https://github.com/apache/dubbo/pull/14820

AlbumenJ avatar Oct 25 '24 08:10 AlbumenJ