Skip to content

Commit

Permalink
fix: apache#3914 protostuff serialize java.sql.Timestamp
Browse files Browse the repository at this point in the history
  • Loading branch information
fitzf committed Apr 23, 2019
1 parent a7ab294 commit d34d88b
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* 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.FieldType;
import io.protostuff.runtime.Delegate;

import java.io.IOException;
import java.sql.Timestamp;

/**
* Custom {@link Timestamp} delegate
*/
public class TimestampDelegate implements Delegate<Timestamp> {

@Override
public FieldType getFieldType() {
return FieldType.FIXED64;
}

@Override
public Timestamp readFrom(Input input) throws IOException {
return new Timestamp(input.readFixed64());
}

@Override
public void writeTo(Output output, int number, Timestamp 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 Timestamp.class;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@

import io.protostuff.runtime.DefaultIdStrategy;
import io.protostuff.runtime.RuntimeEnv;
import org.apache.dubbo.common.serialize.protostuff.delegate.TimestampDelegate;

import java.math.BigDecimal;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Calendar;
Expand Down Expand Up @@ -52,6 +54,7 @@ public class WrapperUtils {
static {
if (RuntimeEnv.ID_STRATEGY instanceof DefaultIdStrategy) {
((DefaultIdStrategy) RuntimeEnv.ID_STRATEGY).registerDelegate(new TimeDelegate());
((DefaultIdStrategy) RuntimeEnv.ID_STRATEGY).registerDelegate(new TimestampDelegate());
}

WRAPPER_SET.add(Map.class);
Expand Down Expand Up @@ -80,6 +83,7 @@ public class WrapperUtils {
WRAPPER_SET.add(Date.class);
WRAPPER_SET.add(Calendar.class);
WRAPPER_SET.add(Time.class);
WRAPPER_SET.add(Timestamp.class);

WRAPPER_SET.add(Wrapper.class);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@
*/
package org.apache.dubbo.common.serialize.protostuff;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.nullValue;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.sql.Timestamp;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

Expand All @@ -46,6 +48,16 @@ public void testWriteObjectNull() throws IOException, ClassNotFoundException {
assertThat(protostuffObjectInput.readObject(), nullValue());
}

@Test
public void testSerializeTimestamp() throws IOException, ClassNotFoundException {
Timestamp originTime = new Timestamp(System.currentTimeMillis());
this.protostuffObjectOutput.writeObject(originTime);
this.flushToInput();

Timestamp serializedTime = protostuffObjectInput.readObject(Timestamp.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 d34d88b

Please sign in to comment.