This is an automated email from the ASF dual-hosted git repository.
iluo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/master by this push:
new ac013b1 [Dubbo-1983] Support Protobuf Serialization (#2618)
ac013b1 is described below
commit ac013b1a658c6dd2e08a541054373f0265cec5fb
Author: Song Kun <[email protected]>
AuthorDate: Fri Oct 26 11:06:09 2018 +0800
[Dubbo-1983] Support Protobuf Serialization (#2618)
* finish support protobuf
* polish
* fix code review
* use the general test for serialization
---
.../dubbo-serialization-protobuf/pom.xml | 60 ++++++++
.../serialize/protobuf/ProtobufObjectInput.java | 158 +++++++++++++++++++++
.../serialize/protobuf/ProtobufObjectOutput.java | 121 ++++++++++++++++
.../serialize/protobuf/ProtobufSerialization.java | 49 +++++++
.../dubbo/common/serialize/protobuf/Wrapper.java | 33 +++++
.../serialize/protobuf/utils/WrapperUtils.java | 67 +++++++++
...org.apache.dubbo.common.serialize.Serialization | 1 +
.../dubbo-serialization-test/pom.xml | 5 +
.../serialize/protobuf/ProtobufPersonOkTest.java | 26 ++++
.../protobuf/ProtobufSerializationTest.java | 26 ++++
dubbo-serialization/pom.xml | 1 +
11 files changed, 547 insertions(+)
diff --git a/dubbo-serialization/dubbo-serialization-protobuf/pom.xml
b/dubbo-serialization/dubbo-serialization-protobuf/pom.xml
new file mode 100644
index 0000000..d1843b0
--- /dev/null
+++ b/dubbo-serialization/dubbo-serialization-protobuf/pom.xml
@@ -0,0 +1,60 @@
+<!--
+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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>dubbo-serialization</artifactId>
+ <groupId>org.apache.dubbo</groupId>
+ <version>2.7.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>dubbo-serialization-protobuf</artifactId>
+ <packaging>jar</packaging>
+ <name>${project.artifactId}</name>
+ <description>The protobuf serialization module of dubbo
project</description>
+
+ <properties>
+ <protobuf.version>1.5.9</protobuf.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.dubbo</groupId>
+ <artifactId>dubbo-serialization-api</artifactId>
+ <version>${project.parent.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.protostuff</groupId>
+ <artifactId>protostuff-core</artifactId>
+ <version>${protobuf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.protostuff</groupId>
+ <artifactId>protostuff-runtime</artifactId>
+ <version>${protobuf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.objenesis</groupId>
+ <artifactId>objenesis</artifactId>
+ <version>2.6</version>
+ </dependency>
+ </dependencies>
+
+</project>
\ No newline at end of file
diff --git
a/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufObjectInput.java
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufObjectInput.java
new file mode 100644
index 0000000..64773e9
--- /dev/null
+++
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufObjectInput.java
@@ -0,0 +1,158 @@
+/*
+ * 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.protobuf;
+
+import io.protostuff.ProtobufIOUtil;
+import io.protostuff.Schema;
+import io.protostuff.runtime.RuntimeSchema;
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.common.serialize.protobuf.utils.WrapperUtils;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+
+public class ProtobufObjectInput implements ObjectInput {
+
+ private DataInputStream dis;
+
+ public ProtobufObjectInput(InputStream inputStream) {
+ dis = new DataInputStream(inputStream);
+ }
+
+ @SuppressWarnings("ResultOfMethodCallIgnored")
+ @Override
+ public Object readObject() throws IOException, ClassNotFoundException {
+ int classNameLength = dis.readInt();
+ int bytesLength = dis.readInt();
+
+ if (classNameLength < 0 || bytesLength < 0) {
+ throw new IOException();
+ }
+
+ byte[] classNameBytes = new byte[classNameLength];
+ dis.readFully(classNameBytes, 0, classNameLength);
+
+ byte[] bytes = new byte[bytesLength];
+ dis.readFully(bytes, 0, bytesLength);
+
+ String className = new String(classNameBytes);
+ Class clazz = Class.forName(className);
+
+ Object result;
+ if (WrapperUtils.needWrapper(clazz)) {
+ Schema<Wrapper> schema = RuntimeSchema.getSchema(Wrapper.class);
+ Wrapper wrapper = schema.newMessage();
+ ProtobufIOUtil.mergeFrom(bytes, wrapper, schema);
+ result = wrapper.getData();
+ } else {
+ Schema schema = RuntimeSchema.getSchema(clazz);
+ result = schema.newMessage();
+ ProtobufIOUtil.mergeFrom(bytes, result, schema);
+ }
+
+ return result;
+ }
+
+ @Override
+ public <T> T readObject(Class<T> clazz) throws IOException,
ClassNotFoundException {
+ int classNameLength = dis.readInt();
+ int bytesLength = dis.readInt();
+
+ if (classNameLength < 0 || bytesLength < 0) {
+ throw new IOException();
+ }
+
+ byte[] classNameBytes = new byte[classNameLength];
+ dis.read(classNameBytes, 0, classNameLength);
+
+ byte[] bytes = new byte[bytesLength];
+ dis.read(bytes, 0, bytesLength);
+
+ T result;
+ if (WrapperUtils.needWrapper(clazz)) {
+ Schema<Wrapper> schema = RuntimeSchema.getSchema(Wrapper.class);
+ Wrapper wrapper = schema.newMessage();
+ ProtobufIOUtil.mergeFrom(bytes, wrapper, schema);
+ result = (T) wrapper.getData();
+ } else {
+ Schema<T> schema = RuntimeSchema.getSchema(clazz);
+ result = schema.newMessage();
+ ProtobufIOUtil.mergeFrom(bytes, result, schema);
+ }
+
+ return result;
+ }
+
+ @Override
+ public <T> T readObject(Class<T> cls, Type type) throws IOException,
ClassNotFoundException {
+ return readObject(cls);
+ }
+
+ @Override
+ public boolean readBool() throws IOException {
+ return dis.readBoolean();
+ }
+
+ @Override
+ public byte readByte() throws IOException {
+ return dis.readByte();
+ }
+
+ @Override
+ public short readShort() throws IOException {
+ return dis.readShort();
+ }
+
+ @Override
+ public int readInt() throws IOException {
+ return dis.readInt();
+ }
+
+ @Override
+ public long readLong() throws IOException {
+ return dis.readLong();
+ }
+
+ @Override
+ public float readFloat() throws IOException {
+ return dis.readFloat();
+ }
+
+ @Override
+ public double readDouble() throws IOException {
+ return dis.readDouble();
+ }
+
+ @Override
+ public String readUTF() throws IOException {
+ int length = dis.readInt();
+ byte[] bytes = new byte[length];
+ dis.read(bytes, 0, length);
+ return new String(bytes);
+ }
+
+ @Override
+ public byte[] readBytes() throws IOException {
+ int length = dis.readInt();
+ byte[] bytes = new byte[length];
+ dis.read(bytes, 0, length);
+ return bytes;
+ }
+}
diff --git
a/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufObjectOutput.java
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufObjectOutput.java
new file mode 100644
index 0000000..8672a66
--- /dev/null
+++
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufObjectOutput.java
@@ -0,0 +1,121 @@
+/*
+ * 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.protobuf;
+
+import io.protostuff.*;
+import io.protostuff.runtime.RuntimeSchema;
+import org.apache.dubbo.common.serialize.ObjectOutput;
+import org.apache.dubbo.common.serialize.protobuf.utils.WrapperUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class ProtobufObjectOutput implements ObjectOutput {
+
+ private DataOutputStream dos;
+
+ public ProtobufObjectOutput(OutputStream outputStream) {
+ dos = new DataOutputStream(outputStream);
+ }
+
+ @Override
+ public void writeObject(Object obj) throws IOException {
+ LinkedBuffer buffer = LinkedBuffer.allocate();
+
+ byte[] bytes;
+ byte[] classNameBytes;
+
+ if (WrapperUtils.needWrapper(obj)) {
+ Schema<Wrapper> schema = RuntimeSchema.getSchema(Wrapper.class);
+ Wrapper wrapper = new Wrapper(obj);
+ bytes = ProtobufIOUtil.toByteArray(wrapper, schema, buffer);
+ classNameBytes = Wrapper.class.getName().getBytes();
+ } else {
+ Schema schema = RuntimeSchema.getSchema(obj.getClass());
+ bytes = ProtobufIOUtil.toByteArray(obj, schema, buffer);
+ classNameBytes = obj.getClass().getName().getBytes();
+ }
+
+ dos.writeInt(classNameBytes.length);
+ dos.writeInt(bytes.length);
+ dos.write(classNameBytes);
+ dos.write(bytes);
+ }
+
+ @Override
+ public void writeBool(boolean v) throws IOException {
+ dos.writeBoolean(v);
+ }
+
+ @Override
+ public void writeByte(byte v) throws IOException {
+ dos.writeByte(v);
+ }
+
+ @Override
+ public void writeShort(short v) throws IOException {
+ dos.writeShort(v);
+ }
+
+ @Override
+ public void writeInt(int v) throws IOException {
+ dos.writeInt(v);
+ }
+
+ @Override
+ public void writeLong(long v) throws IOException {
+ dos.writeLong(v);
+ }
+
+ @Override
+ public void writeFloat(float v) throws IOException {
+ dos.writeFloat(v);
+ }
+
+ @Override
+ public void writeDouble(double v) throws IOException {
+ dos.writeDouble(v);
+ }
+
+ @Override
+ public void writeUTF(String v) throws IOException {
+ byte[] bytes = v.getBytes();
+ dos.writeInt(bytes.length);
+ dos.write(bytes);
+ }
+
+ @Override
+ public void writeBytes(byte[] v) throws IOException {
+ dos.writeInt(v.length);
+ dos.write(v);
+ }
+
+ @Override
+ public void writeBytes(byte[] v, int off, int len) throws IOException {
+ dos.writeInt(len);
+ byte[] bytes = new byte[len];
+ System.arraycopy(v, off, bytes, 0, len);
+ dos.write(bytes);
+ }
+
+ @Override
+ public void flushBuffer() throws IOException {
+ dos.flush();
+ }
+}
diff --git
a/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufSerialization.java
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufSerialization.java
new file mode 100644
index 0000000..e87d25d
--- /dev/null
+++
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/ProtobufSerialization.java
@@ -0,0 +1,49 @@
+/*
+ * 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.protobuf;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.common.serialize.ObjectOutput;
+import org.apache.dubbo.common.serialize.Serialization;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class ProtobufSerialization implements Serialization {
+ @Override
+ public byte getContentTypeId() {
+ return 10;
+ }
+
+ @Override
+ public String getContentType() {
+ return "x-application/protobuf";
+ }
+
+ @Override
+ public ObjectOutput serialize(URL url, OutputStream output) throws
IOException {
+ return new ProtobufObjectOutput(output);
+ }
+
+ @Override
+ public ObjectInput deserialize(URL url, InputStream input) throws
IOException {
+ return new ProtobufObjectInput(input);
+ }
+}
diff --git
a/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/Wrapper.java
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/Wrapper.java
new file mode 100644
index 0000000..498c6c9
--- /dev/null
+++
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/Wrapper.java
@@ -0,0 +1,33 @@
+/*
+ * 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.protobuf;
+
+/**
+ * Protostuff can only serialize/deserialize POJOs, for those it can't deal
with, use this Wrapper.
+ */
+public class Wrapper<T> {
+ private T data;
+
+ Wrapper(T data) {
+ this.data = data;
+ }
+
+ Object getData() {
+ return data;
+ }
+}
diff --git
a/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/utils/WrapperUtils.java
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/utils/WrapperUtils.java
new file mode 100644
index 0000000..32806d1
--- /dev/null
+++
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/java/org/apache/dubbo/common/serialize/protobuf/utils/WrapperUtils.java
@@ -0,0 +1,67 @@
+/*
+ * 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.protobuf.utils;
+
+import org.apache.dubbo.common.serialize.protobuf.Wrapper;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class WrapperUtils {
+ private static final Set<Class<?>> WRAPPER_SET = new HashSet<>();
+
+ static {
+ WRAPPER_SET.add(Map.class);
+ WRAPPER_SET.add(HashMap.class);
+ WRAPPER_SET.add(TreeMap.class);
+ WRAPPER_SET.add(Hashtable.class);
+ WRAPPER_SET.add(SortedMap.class);
+ WRAPPER_SET.add(LinkedHashMap.class);
+ WRAPPER_SET.add(ConcurrentHashMap.class);
+
+ WRAPPER_SET.add(List.class);
+ WRAPPER_SET.add(ArrayList.class);
+ WRAPPER_SET.add(LinkedList.class);
+
+ WRAPPER_SET.add(Vector.class);
+
+ WRAPPER_SET.add(Set.class);
+ WRAPPER_SET.add(HashSet.class);
+ WRAPPER_SET.add(TreeSet.class);
+ WRAPPER_SET.add(BitSet.class);
+
+ WRAPPER_SET.add(StringBuffer.class);
+ WRAPPER_SET.add(StringBuilder.class);
+
+ WRAPPER_SET.add(BigDecimal.class);
+ WRAPPER_SET.add(Date.class);
+ WRAPPER_SET.add(Calendar.class);
+
+ WRAPPER_SET.add(Wrapper.class);
+ }
+
+ public static boolean needWrapper(Class<?> clazz) {
+ return WrapperUtils.WRAPPER_SET.contains(clazz) || clazz.isArray() ||
clazz.isEnum();
+ }
+
+ public static boolean needWrapper(Object obj) {
+ return needWrapper(obj.getClass());
+ }
+
+}
diff --git
a/dubbo-serialization/dubbo-serialization-protobuf/src/main/resources/META-INF.dubbo.internal/org.apache.dubbo.common.serialize.Serialization
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/resources/META-INF.dubbo.internal/org.apache.dubbo.common.serialize.Serialization
new file mode 100644
index 0000000..c276c91
--- /dev/null
+++
b/dubbo-serialization/dubbo-serialization-protobuf/src/main/resources/META-INF.dubbo.internal/org.apache.dubbo.common.serialize.Serialization
@@ -0,0 +1 @@
+protobuf=org.apache.dubbo.common.serialize.protobuf.ProtobufSerialization
\ No newline at end of file
diff --git a/dubbo-serialization/dubbo-serialization-test/pom.xml
b/dubbo-serialization/dubbo-serialization-test/pom.xml
index 8c8b8fa..4577f7f 100644
--- a/dubbo-serialization/dubbo-serialization-test/pom.xml
+++ b/dubbo-serialization/dubbo-serialization-test/pom.xml
@@ -61,6 +61,11 @@
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
+ <artifactId>dubbo-serialization-protobuf</artifactId>
+ <version>${project.parent.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
diff --git
a/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protobuf/ProtobufPersonOkTest.java
b/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protobuf/ProtobufPersonOkTest.java
new file mode 100644
index 0000000..53e021f
--- /dev/null
+++
b/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protobuf/ProtobufPersonOkTest.java
@@ -0,0 +1,26 @@
+/*
+ * 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.protobuf;
+
+import
org.apache.dubbo.common.serialize.base.AbstractSerializationPersonOkTest;
+
+public class ProtobufPersonOkTest extends AbstractSerializationPersonOkTest {
+ {
+ serialization = new ProtobufSerialization();
+ }
+}
diff --git
a/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protobuf/ProtobufSerializationTest.java
b/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protobuf/ProtobufSerializationTest.java
new file mode 100644
index 0000000..ffb5fc6
--- /dev/null
+++
b/dubbo-serialization/dubbo-serialization-test/src/test/java/org/apache/dubbo/common/serialize/protobuf/ProtobufSerializationTest.java
@@ -0,0 +1,26 @@
+/*
+ * 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.protobuf;
+
+import org.apache.dubbo.common.serialize.base.AbstractSerializationTest;
+
+public class ProtobufSerializationTest extends AbstractSerializationTest {
+ {
+ serialization = new ProtobufSerialization();
+ }
+}
diff --git a/dubbo-serialization/pom.xml b/dubbo-serialization/pom.xml
index 9c2e869..8546a1b 100644
--- a/dubbo-serialization/pom.xml
+++ b/dubbo-serialization/pom.xml
@@ -35,6 +35,7 @@
<module>dubbo-serialization-kryo</module>
<module>dubbo-serialization-fst</module>
<module>dubbo-serialization-jdk</module>
+ <module>dubbo-serialization-protobuf</module>
<module>dubbo-serialization-test</module>
</modules>
</project>