Skip to content

Commit

Permalink
[Dubbo-2.7.2] Fix the protostuff protocol lacks a custom serializatio…
Browse files Browse the repository at this point in the history
…n method for java.sql.Date apache#4384 (apache#4386)

* fix: apache#3727

* style: code tidy up

* style: add apache license

* fix: apache#3914 protostuff serialize java.sql.Timestamp

* fix: add SqlDateDelegate to fix protostuff custon serialize java.sql.Date

fix apache#4384
  • Loading branch information
fitzf authored and rolandhe committed Sep 9, 2019
1 parent d68da87 commit 0ef3dad
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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());
Expand Down

0 comments on commit 0ef3dad

Please sign in to comment.