diff --git a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/delegate/SqlDateDelegate.java b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/delegate/SqlDateDelegate.java new file mode 100644 index 00000000000..a1a7a421cec --- /dev/null +++ b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/delegate/SqlDateDelegate.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.common.serialize.protostuff.delegate; + +import io.protostuff.Input; +import io.protostuff.Output; +import io.protostuff.Pipe; +import io.protostuff.WireFormat; +import io.protostuff.runtime.Delegate; + +import java.io.IOException; + +/** + * Custom {@link java.sql.Date} delegate + */ +public class SqlDateDelegate implements Delegate { + @Override + public WireFormat.FieldType getFieldType() { + return WireFormat.FieldType.FIXED64; + } + + @Override + public java.sql.Date readFrom(Input input) throws IOException { + return new java.sql.Date(input.readFixed64()); + } + + @Override + public void writeTo(Output output, int number, java.sql.Date value, boolean repeated) throws IOException { + output.writeFixed64(number, value.getTime(), repeated); + } + + @Override + public void transfer(Pipe pipe, Input input, Output output, int number, boolean repeated) throws IOException { + output.writeFixed64(number, input.readFixed64(), repeated); + } + + @Override + public Class typeClass() { + return java.sql.Date.class; + } +} diff --git a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/utils/WrapperUtils.java b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/utils/WrapperUtils.java index 9ebcc464151..80a67efc92b 100644 --- a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/utils/WrapperUtils.java +++ b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/utils/WrapperUtils.java @@ -18,6 +18,7 @@ package org.apache.dubbo.common.serialize.protostuff.utils; import org.apache.dubbo.common.serialize.protostuff.Wrapper; +import org.apache.dubbo.common.serialize.protostuff.delegate.SqlDateDelegate; import org.apache.dubbo.common.serialize.protostuff.delegate.TimeDelegate; import io.protostuff.runtime.DefaultIdStrategy; @@ -55,6 +56,7 @@ public class WrapperUtils { if (RuntimeEnv.ID_STRATEGY instanceof DefaultIdStrategy) { ((DefaultIdStrategy) RuntimeEnv.ID_STRATEGY).registerDelegate(new TimeDelegate()); ((DefaultIdStrategy) RuntimeEnv.ID_STRATEGY).registerDelegate(new TimestampDelegate()); + ((DefaultIdStrategy) RuntimeEnv.ID_STRATEGY).registerDelegate(new SqlDateDelegate()); } WRAPPER_SET.add(Map.class); @@ -84,6 +86,7 @@ public class WrapperUtils { WRAPPER_SET.add(Calendar.class); WRAPPER_SET.add(Time.class); WRAPPER_SET.add(Timestamp.class); + WRAPPER_SET.add(java.sql.Date.class); WRAPPER_SET.add(Wrapper.class); diff --git a/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectOutputTest.java b/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectOutputTest.java index 39a621b0b8e..52397920f0f 100644 --- a/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectOutputTest.java +++ b/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectOutputTest.java @@ -24,6 +24,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.sql.Timestamp; +import java.util.Date; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -58,6 +60,36 @@ public void testSerializeTimestamp() throws IOException, ClassNotFoundException assertThat(serializedTime, is(originTime)); } + @Test + public void testSerializeSqlDate() throws IOException, ClassNotFoundException { + java.sql.Date originTime = new java.sql.Date(System.currentTimeMillis()); + this.protostuffObjectOutput.writeObject(originTime); + this.flushToInput(); + + java.sql.Date serializedTime = protostuffObjectInput.readObject(java.sql.Date.class); + assertThat(serializedTime, is(originTime)); + } + + @Test + public void testSerializeSqlTime() throws IOException, ClassNotFoundException { + java.sql.Time originTime = new java.sql.Time(System.currentTimeMillis()); + this.protostuffObjectOutput.writeObject(originTime); + this.flushToInput(); + + java.sql.Time serializedTime = protostuffObjectInput.readObject(java.sql.Time.class); + assertThat(serializedTime, is(originTime)); + } + + @Test + public void testSerializeDate() throws IOException, ClassNotFoundException { + Date originTime = new Date(); + this.protostuffObjectOutput.writeObject(originTime); + this.flushToInput(); + + Date serializedTime = protostuffObjectInput.readObject(Date.class); + assertThat(serializedTime, is(originTime)); + } + private void flushToInput() throws IOException { this.protostuffObjectOutput.flushBuffer(); this.byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());