You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by cr...@apache.org on 2019/07/03 02:44:03 UTC

[dubbo] branch master updated: [Dubbo-2.7.2] Fix the protostuff protocol lacks a custom serialization method for java.sql.Date #4384 (#4386)

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

crazyhzm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new a42fb15  [Dubbo-2.7.2] Fix the protostuff protocol lacks a custom serialization method for java.sql.Date #4384 (#4386)
a42fb15 is described below

commit a42fb1535d45fe372e21515f4941002423c22fb5
Author: zhangfei <67...@qq.com>
AuthorDate: Wed Jul 3 10:43:50 2019 +0800

    [Dubbo-2.7.2] Fix the protostuff protocol lacks a custom serialization method for java.sql.Date #4384 (#4386)
    
    * fix: #3727
    
    * style: code tidy up
    
    * style: add apache license
    
    * fix: #3914 protostuff serialize java.sql.Timestamp
    
    * fix: add SqlDateDelegate to fix protostuff custon serialize java.sql.Date
    
    fix #4384
---
 .../protostuff/delegate/SqlDateDelegate.java       | 55 ++++++++++++++++++++++
 .../serialize/protostuff/utils/WrapperUtils.java   |  3 ++
 .../protostuff/ProtostuffObjectOutputTest.java     | 32 +++++++++++++
 3 files changed, 90 insertions(+)

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 0000000..a1a7a42
--- /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<java.sql.Date> {
+    @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 9ebcc46..80a67ef 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 39a621b..5239792 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.ByteArrayInputStream;
 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 class ProtostuffObjectOutputTest {
         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());