You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by GitBox <gi...@apache.org> on 2018/10/10 03:54:17 UTC

[GitHub] liubao68 closed pull request #930: [SCB-918] Codec based on proto

liubao68 closed pull request #930: [SCB-918] Codec based on proto
URL: https://github.com/apache/incubator-servicecomb-java-chassis/pull/930
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/LambdaMetafactoryUtils.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/LambdaMetafactoryUtils.java
index 3e8578709..ef182091e 100644
--- a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/LambdaMetafactoryUtils.java
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/LambdaMetafactoryUtils.java
@@ -45,7 +45,6 @@ protected static Method findAbstractMethod(Class<?> functionalInterface) {
     return null;
   }
 
-  @SuppressWarnings("unchecked")
   public static <T> T createLambda(Object instance, Method instanceMethod, Class<?> functionalIntfCls)
       throws Throwable {
     Method intfMethod = findAbstractMethod(functionalIntfCls);
@@ -60,13 +59,12 @@ protected static Method findAbstractMethod(Class<?> functionalInterface) {
         MethodType.methodType(functionalIntfCls, instance.getClass()),
         intfMethodType,
         methodHandle,
-        instanceMethodType
-    );
+        instanceMethodType);
 
+    //noinspection unchecked
     return (T) callSite.getTarget().bindTo(instance).invoke();
   }
 
-  @SuppressWarnings("unchecked")
   public static <T> T createLambda(Method instanceMethod, Class<?> functionalIntfCls)
       throws Throwable {
     Method intfMethod = findAbstractMethod(functionalIntfCls);
@@ -80,9 +78,9 @@ protected static Method findAbstractMethod(Class<?> functionalInterface) {
         MethodType.methodType(functionalIntfCls),
         intfMethodType,
         methodHandle,
-        instanceMethodType
-    );
+        instanceMethodType);
 
+    //noinspection unchecked
     return (T) callSite.getTarget().invoke();
   }
 
diff --git a/foundations/foundation-protobuf/README.md b/foundations/foundation-protobuf/README.md
new file mode 100644
index 000000000..fdb04eca1
--- /dev/null
+++ b/foundations/foundation-protobuf/README.md
@@ -0,0 +1,155 @@
+# Overview
+There are many existing protobuf codecs, but not suit for us, so we create new one:
+- official, must generate code
+  - 40+ lines proto file, generate 5000+ java code
+  - bind business model to protobuf, but our business can switch different codecs dynamically
+  - strong type, there is no business jar in edge service, no strong types
+- protostuff
+  - strong type
+  - map codec is not compatible to protobuf
+- jackson
+  - not support map/any type
+  - performance is not so good
+   
+# Usage
+## Create factory  
+  one factory instance globally is enough    
+```java
+ProtoMapperFactory factory = new ProtoMapperFactory();
+```
+## Load proto definition
+  create mapper instance for each proto definition  
+- load from classpath  
+```java
+ProtoMapper protoMapper = factory.createFromName("protobuf.proto");
+```
+- load from proto content 
+```java
+ProtoMapper protoMapper = factory.createFromContent(protoContent);
+```
+## Serialize
+serializer is reusable and thread safe  
+Assuming you have a proto definition
+```proto
+message User {
+  string name = 1;
+}
+```
+and a POJO class
+```java
+public class User {
+  private String name;
+  // getter and setter 
+}
+```
+```java
+RootSerializer serializer = protoMapper.findRootSerializer("User");
+
+User user = new User();
+user.setName("userName");
+byte[] pojoBytes= serializer.serialize(user);
+
+Map<String, Object> map = new HashMap<>();
+map.put("name", "userName");
+byte[] mapBytes = serializer.serialize(map);
+
+// pojoBytes equals mapBytes
+```
+## Deserialize
+deserializer is reusable and thread safe  
+```java
+RootDeserializer pojoDeserializer = protoMapper.createRootDeserializer(User.class, "User");
+RootDeserializer mapDeserializer = protoMapper.createRootDeserializer(Map.class, "User");
+
+User user = pojoDeserializer.deserialize(bytes);
+Map<String, Object> map = mapDeserializer.deserialize(bytes);
+```
+
+# Features
+- compare to official protobuf:
+  - extend "any" type, for standard not support cases, use "json" schema to codec it.
+- compare to protoStuff runtime:
+  - for a proto message type, not only support strong type(Pojo), but alse support weak type(Map)
+  - support "any" type
+  - support generic pojo type, eg:CustomGeneric&lt;User&gt;
+  - **NOT** support List<List<XXX>>/List<Map<X, Y>> any more, because protobuf specification not support it, and the parser can not parse the proto file
+- compare to jackson protobuf:
+  - can parse protobuf 3 proto file
+  - support protobuf 3: map/any
+- compare to all:
+  - just pojo, no need any code generation and annotation
+  - one model can serialize to different version proto file to support different version server
+  - support text data come from http,can serrialize from different data type
+    - number fields (int32/int64 and so on)
+      - number
+      - String
+      - String[]
+    - string fields
+      - string
+      - string[]
+    - bool fields
+      - boolean
+      - string
+      - string[]
+    - enum fields
+      - enum
+      - number
+      - string
+      - string[]
+# Performance
+```
+1.protobuf
+  in our real scenes
+  business model never bind to transport, and can switch between different transports dynamically
+  that means if we choose standard protobuf, must build protobuf models from business models each time
+  so should be much slower than the test results
+2.protoStuff
+  some scenes, there is no field but have getter or setter, so we can not use unsafe to access field
+  so we disable protoStuff unsafe feature
+3.jackson
+  not support map, so skip map in map/mixed test
+4.serialize result size
+  ScbStrong/ScbWeak/Protobuf have the same and smaller size, because skip all default/null value
+  
+Empty:
+               Protostuff ScbStrong  ScbWeak    Protobuf   Jackson    
+ser time(ms)  :250        250        235        156        437        
+ser len       :36         0          0          0          56         
+deser time(ms):125        15         0          257        483        
+deser-ser len :36         0          0          0          56         
+
+Scalars:
+               Protostuff ScbStrong  ScbWeak    Protobuf   Jackson    
+ser time(ms)  :235        264        218        156        413        
+ser len       :53         21         21         21         73         
+deser time(ms):156        63         94         225        469        
+deser-ser len :53         21         21         21         73         
+
+SimpleList:
+               Protostuff ScbStrong  ScbWeak    Protobuf   Jackson    
+ser time(ms)  :266        250        220        172        440        
+ser len       :68         32         32         32         88         
+deser time(ms):234        94         109        265        499        
+deser-ser len :68         32         32         32         88         
+
+PojoList:
+               Protostuff ScbStrong  ScbWeak    Protobuf   Jackson    
+ser time(ms)  :297        343        235        187        543        
+ser len       :56         20         20         20         76         
+deser time(ms):211        126        168        298        610        
+deser-ser len :56         20         20         20         76         
+
+Map:
+               Protostuff ScbStrong  ScbWeak    Protobuf   Jackson    
+ser time(ms)  :404        512        424        533        403        
+ser len       :92         54         54         54         56         
+deser time(ms):500        343        406        750        359        
+deser-ser len :92         54         54         54         56         
+
+Mixed:
+               Protostuff ScbStrong  ScbWeak    Protobuf   Jackson    
+ser time(ms)  :579        704        547        579        625        
+ser len       :161        127        127        127        125        
+deser time(ms):736        623        766        1015       798        
+deser-ser len :161        127        127        127        125      
+```
\ No newline at end of file
diff --git a/foundations/foundation-protobuf/pom.xml b/foundations/foundation-protobuf/pom.xml
index 8eaa4e5a1..a5e1416d3 100644
--- a/foundations/foundation-protobuf/pom.xml
+++ b/foundations/foundation-protobuf/pom.xml
@@ -16,8 +16,7 @@
   ~ limitations under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<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">
   <parent>
     <artifactId>foundations</artifactId>
@@ -37,6 +36,14 @@
       <groupId>io.protostuff</groupId>
       <artifactId>protostuff-parser</artifactId>
     </dependency>
+    <dependency>
+      <groupId>io.protostuff</groupId>
+      <artifactId>protostuff-runtime</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.protostuff</groupId>
+      <artifactId>protostuff-core</artifactId>
+    </dependency>
     <dependency>
       <groupId>com.google.code.findbugs</groupId>
       <artifactId>jsr305</artifactId>
@@ -48,5 +55,10 @@
       <version>3.6.1</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <artifactId>jackson-dataformat-protobuf</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/foundations/foundation-protobuf/src/main/java/io/protostuff/runtime/MessageSchema.java b/foundations/foundation-protobuf/src/main/java/io/protostuff/runtime/MessageSchema.java
new file mode 100644
index 000000000..bd495724f
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/io/protostuff/runtime/MessageSchema.java
@@ -0,0 +1,268 @@
+/*
+ * 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 io.protostuff.runtime;
+
+import static io.protostuff.runtime.RuntimeSchema.MIN_TAG_FOR_HASH_FIELD_MAP;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
+import org.apache.servicecomb.foundation.protobuf.internal.bean.BeanDescriptor;
+import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.PojoFieldSerializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.Schema;
+import io.protostuff.compiler.model.Message;
+import io.protostuff.runtime.RuntimeEnv.Instantiator;
+
+public class MessageSchema implements Schema<Object>, FieldMap<Object> {
+  private static final Logger LOGGER = LoggerFactory.getLogger(MessageSchema.class);
+
+  private ProtoMapper protoMapper;
+
+  private FieldMap<Object> fieldMap;
+
+  private Class<Object> typeClass;
+
+  private Instantiator<Object> instantiator;
+
+  private Message message;
+
+  // one class can bind to different proto message (almost different version)
+  // so save the information only in message, not global
+  private final Map<Type, List<PojoFieldSerializer>> pojoFieldSerializers = new ConcurrentHashMapEx<>();
+
+  public void init(ProtoMapper protoMapper, Collection<Field<Object>> fields, Message message) {
+    init(protoMapper, null, fields, null, message);
+  }
+
+  public void init(ProtoMapper protoMapper, Class<Object> typeClass, Collection<Field<Object>> fields,
+      Instantiator<Object> instantiator,
+      Message message) {
+    this.protoMapper = protoMapper;
+    this.fieldMap = createFieldMap(fields);
+    this.instantiator = instantiator;
+    this.typeClass = typeClass;
+    this.message = message;
+  }
+
+  public Message getMessage() {
+    return message;
+  }
+
+  private FieldMap<Object> createFieldMap(Collection<Field<Object>> fields) {
+    int lastFieldNumber = 0;
+    for (Field<Object> field : fields) {
+      if (field.number > lastFieldNumber) {
+        lastFieldNumber = field.number;
+      }
+    }
+    if (preferHashFieldMap(fields, lastFieldNumber)) {
+      return new HashFieldMap<>(fields);
+    }
+    // array field map should be more efficient
+    return new ArrayFieldMap<>(fields, lastFieldNumber);
+  }
+
+  private boolean preferHashFieldMap(Collection<Field<Object>> fields, int lastFieldNumber) {
+    return lastFieldNumber > MIN_TAG_FOR_HASH_FIELD_MAP && lastFieldNumber >= 2 * fields.size();
+  }
+
+  @Override
+  public String getFieldName(int number) {
+    // only called on writes
+    final Field<Object> field = fieldMap.getFieldByNumber(number);
+    return field == null ? null : field.name;
+  }
+
+  @Override
+  public int getFieldNumber(String name) {
+    final Field<Object> field = fieldMap.getFieldByName(name);
+    return field == null ? null : field.number;
+  }
+
+  @Override
+  public boolean isInitialized(Object message) {
+    return true;
+  }
+
+  @Override
+  public Object newMessage() {
+    return instantiator.newInstance();
+  }
+
+  @Override
+  public String messageName() {
+    return message.getName();
+  }
+
+  @Override
+  public String messageFullName() {
+    return message.getCanonicalName();
+  }
+
+  @Override
+  public Class<? super Object> typeClass() {
+    return typeClass;
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    Field<Object> field = null;
+    try {
+      for (int n = input.readFieldNumber(this); n != 0; n = input.readFieldNumber(this)) {
+        field = fieldMap.getFieldByNumber(n);
+        if (field == null) {
+          input.handleUnknownField(n, this);
+        } else {
+          field.mergeFrom(input, message);
+        }
+      }
+    } catch (IOException e) {
+      logError((FieldSchema) field, "deserialize", e);
+      throw e;
+    } catch (RuntimeException e) {
+      logError((FieldSchema) field, "deserialize", e);
+      throw e;
+    }
+  }
+
+  protected void logError(FieldSchema fieldSchema, String action, Throwable e) {
+    if (fieldSchema == null) {
+      return;
+    }
+
+    io.protostuff.compiler.model.Field protoField = fieldSchema.getProtoField();
+    LOGGER.error("Failed to {}, field={}:{}, type={}",
+        action,
+        protoField.getType().getCanonicalName(),
+        protoField.getName(),
+        protoField.getTypeName(),
+        e.getMessage());
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void writeTo(Output output, Object message) throws IOException {
+    if (message == null) {
+      return;
+    }
+
+    if (message instanceof Map) {
+      writeFromMap(output, (Map<String, Object>) message);
+      return;
+    }
+
+    writeFromPojo(output, message);
+  }
+
+  /**
+   * <pre>
+   * when use with generic
+   * each time serialize the value field, will run with the real type
+   * so there is no problem
+   *
+   * eg: CustomeGeneric&lt;User&gt; someMethod(CustomGeneric&lt;People&gt; input)
+   *   input: {
+   *     People value
+   *   }
+   *   output: {
+   *     User value
+   *   }
+   * </pre>
+   * @param output
+   * @param value
+   * @throws Throwable
+   */
+  protected void writeFromPojo(Output output, Object value) throws IOException {
+    List<PojoFieldSerializer> serializers = pojoFieldSerializers
+        .computeIfAbsent(value.getClass(), this::createFieldSerializers);
+    for (PojoFieldSerializer serializer : serializers) {
+      serializer.writeTo(output, value);
+    }
+  }
+
+  protected List<PojoFieldSerializer> createFieldSerializers(Type type) {
+    BeanDescriptor beanDescriptor = protoMapper.getBeanDescriptorManager().getOrCreateBeanDescriptor(type);
+    List<PojoFieldSerializer> pojoFieldSerializers = new ArrayList<>();
+    for (Field<Object> f : fieldMap.getFields()) {
+      PropertyDescriptor propertyDescriptor = beanDescriptor.getPropertyDescriptors().get(f.name);
+      if (propertyDescriptor == null) {
+        continue;
+      }
+
+      Getter getter = propertyDescriptor.getGetter();
+      if (getter == null) {
+        continue;
+      }
+
+      pojoFieldSerializers.add(new PojoFieldSerializer(getter, (FieldSchema) f));
+    }
+
+    return pojoFieldSerializers;
+  }
+
+  protected void writeFromMap(Output output, Map<String, Object> map) throws IOException {
+    for (Entry<String, Object> entry : map.entrySet()) {
+      if (entry.getValue() == null) {
+        continue;
+      }
+
+      Field<Object> field = fieldMap.getFieldByName(entry.getKey());
+      if (field == null) {
+        // not defined in proto, ignore it.
+        continue;
+      }
+
+      field.writeTo(output, entry.getValue());
+    }
+  }
+
+  @Override
+  public Field<Object> getFieldByNumber(int n) {
+    return fieldMap.getFieldByNumber(n);
+  }
+
+  @Override
+  public Field<Object> getFieldByName(String fieldName) {
+    return fieldMap.getFieldByName(fieldName);
+  }
+
+  @Override
+  public int getFieldCount() {
+    return fieldMap.getFieldCount();
+  }
+
+  @Override
+  public List<Field<Object>> getFields() {
+    return fieldMap.getFields();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapper.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapper.java
new file mode 100644
index 000000000..860a9f6f0
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapper.java
@@ -0,0 +1,108 @@
+/*
+ * 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.servicecomb.foundation.protobuf;
+
+import java.lang.reflect.Type;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+import org.apache.servicecomb.foundation.protobuf.internal.bean.BeanDescriptorManager;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.deserializer.DeserializerSchemaManager;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.SerializerSchemaManager;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+import io.protostuff.compiler.model.Message;
+import io.protostuff.compiler.model.Proto;
+
+public class ProtoMapper {
+  private final ObjectMapper jsonMapper;
+
+  private final BeanDescriptorManager beanDescriptorManager;
+
+  private final Proto proto;
+
+  private final SerializerSchemaManager serializerSchemaManager;
+
+  private final DeserializerSchemaManager deserializerSchemaManager;
+
+  // key is message canonical name
+  // this allowed developer to control any type deserializer
+  // otherwise any type will be deserialized to LinkedHashMap
+  private final Map<String, JavaType> anyTypes = new ConcurrentHashMapEx<>();
+
+  protected ProtoMapper(ObjectMapper jsonMapper, BeanDescriptorManager beanDescriptorManager, Proto proto) {
+    this.jsonMapper = jsonMapper;
+    this.beanDescriptorManager = beanDescriptorManager;
+    this.proto = proto;
+
+    serializerSchemaManager = new SerializerSchemaManager(this);
+    deserializerSchemaManager = new DeserializerSchemaManager(this);
+  }
+
+  public Proto getProto() {
+    return proto;
+  }
+
+  public ObjectMapper getJsonMapper() {
+    return jsonMapper;
+  }
+
+  public BeanDescriptorManager getBeanDescriptorManager() {
+    return beanDescriptorManager;
+  }
+
+  public Map<String, JavaType> getAnyTypes() {
+    return anyTypes;
+  }
+
+  public void addAnyType(String canonicalName, Type type) {
+    anyTypes.put(canonicalName, TypeFactory.defaultInstance().constructType(type));
+  }
+
+  public Message getMessageFromCanonicaName(String messageCanonicalName) {
+    for (Message message : proto.getMessages()) {
+      if (message.getCanonicalName().equals(messageCanonicalName)) {
+        return message;
+      }
+    }
+
+    return null;
+  }
+
+  public RootSerializer findRootSerializer(String shortMessageName) {
+    return serializerSchemaManager.findRootSerializer(shortMessageName);
+  }
+
+  public RootSerializer findRootSerializerByCanonical(String canonicalMessageName) {
+    return serializerSchemaManager.findRootSerializerByCanonical(canonicalMessageName);
+  }
+
+  public RootDeserializer createRootDeserializer(Type type, String shortMessageName) {
+    return createRootDeserializer(TypeFactory.defaultInstance().constructType(type), shortMessageName);
+  }
+
+  public RootDeserializer createRootDeserializer(JavaType javaType, String shortMessageName) {
+    return deserializerSchemaManager.createRootDeserializer(javaType, shortMessageName);
+  }
+
+  public RootDeserializer createRootDeserializer(JavaType javaType, Message message) {
+    return deserializerSchemaManager.createRootDeserializer(javaType, message);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapperFactory.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapperFactory.java
new file mode 100644
index 000000000..1e1caba71
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapperFactory.java
@@ -0,0 +1,62 @@
+/*
+ * 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.servicecomb.foundation.protobuf;
+
+import org.apache.servicecomb.foundation.protobuf.internal.bean.BeanDescriptorManager;
+import org.apache.servicecomb.foundation.protobuf.internal.parser.ProtoParser;
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import io.protostuff.compiler.model.Proto;
+
+public class ProtoMapperFactory {
+  // 1.to support "any" type
+  // 2.to find bean properties
+  private ObjectMapper jsonMapper = new ObjectMapper();
+
+  private BeanDescriptorManager beanDescriptorManager;
+
+  private ProtoParser protoParser = new ProtoParser();
+
+  public ProtoMapperFactory() {
+    jsonMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+    jsonMapper.setSerializationInclusion(Include.NON_NULL);
+//    jsonMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.PROPERTY);
+
+    beanDescriptorManager = new BeanDescriptorManager(jsonMapper.getSerializationConfig());
+  }
+
+  public BeanDescriptorManager getBeanDescriptorManager() {
+    return beanDescriptorManager;
+  }
+
+  public ProtoMapper createFromContent(String content) {
+    Proto proto = protoParser.parseFromContent(content);
+    return create(proto);
+  }
+
+  public ProtoMapper createFromName(String name) {
+    Proto proto = protoParser.parse(name);
+    return create(proto);
+  }
+
+  public ProtoMapper create(Proto proto) {
+    return new ProtoMapper(jsonMapper, beanDescriptorManager, proto);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/RootDeserializer.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/RootDeserializer.java
new file mode 100644
index 000000000..7b600bc48
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/RootDeserializer.java
@@ -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.
+ */
+package org.apache.servicecomb.foundation.protobuf;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.bean.BeanDescriptor;
+
+import io.protostuff.ByteArrayInput;
+import io.protostuff.Input;
+import io.protostuff.runtime.MessageSchema;
+
+public class RootDeserializer {
+  private BeanDescriptor beanDescriptor;
+
+  private MessageSchema schema;
+
+  public RootDeserializer(BeanDescriptor beanDescriptor, MessageSchema schema) {
+    this.beanDescriptor = beanDescriptor;
+    this.schema = schema;
+  }
+
+  public BeanDescriptor getBeanDescriptor() {
+    return beanDescriptor;
+  }
+
+  public void setBeanDescriptor(BeanDescriptor beanDescriptor) {
+    this.beanDescriptor = beanDescriptor;
+  }
+
+  public MessageSchema getSchema() {
+    return schema;
+  }
+
+  public void setSchema(MessageSchema schema) {
+    this.schema = schema;
+  }
+
+  @SuppressWarnings("unchecked")
+  public <T> T deserialize(byte[] bytes) throws IOException {
+    Input input = new ByteArrayInput(bytes, false);
+    Object instance = beanDescriptor.create();
+    schema.mergeFrom(input, instance);
+    return (T) instance;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/RootSerializer.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/RootSerializer.java
new file mode 100644
index 000000000..870c7aa38
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/RootSerializer.java
@@ -0,0 +1,52 @@
+/*
+ * 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.servicecomb.foundation.protobuf;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.ProtoStreamOutput;
+
+import io.protostuff.runtime.MessageSchema;
+
+public class RootSerializer {
+  private MessageSchema schema;
+
+  public RootSerializer(MessageSchema schema) {
+    this.schema = schema;
+  }
+
+  public MessageSchema getSchema() {
+    return schema;
+  }
+
+  public void setSchema(MessageSchema schema) {
+    this.schema = schema;
+  }
+
+  /**
+   * not same to standard ProtoStuff mechanism
+   * parameter "value" of writeTo is self value, not owner
+   * @param value
+   * @return
+   * @throws Throwable
+   */
+  public byte[] serialize(Object value) throws IOException {
+    ProtoStreamOutput output = new ProtoStreamOutput();
+    schema.writeTo(output, value);
+    return output.toBytes();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/ProtoConst.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/ProtoConst.java
new file mode 100644
index 000000000..c15dbaeb3
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/ProtoConst.java
@@ -0,0 +1,32 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal;
+
+import java.util.LinkedHashMap;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+public interface ProtoConst {
+  String PACK_SCHEMA = "type.googleapis.com/";
+
+  String JSON_SCHEMA = "json/";
+
+  String JSON_ID_NAME = "@type";
+
+  JavaType MAP_TYPE = TypeFactory.defaultInstance().constructType(LinkedHashMap.class);
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnyEntry.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnyEntry.java
new file mode 100644
index 000000000..afd5307a2
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnyEntry.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+public class AnyEntry {
+  private String typeUrl;
+
+  private byte[] value;
+
+  public String getTypeUrl() {
+    return typeUrl;
+  }
+
+  public void setTypeUrl(String typeUrl) {
+    this.typeUrl = typeUrl;
+  }
+
+  public byte[] getValue() {
+    return value;
+  }
+
+  public void setValue(byte[] value) {
+    this.value = value;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnyEntrySchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnyEntrySchema.java
new file mode 100644
index 000000000..f4828e810
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnyEntrySchema.java
@@ -0,0 +1,119 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
+import org.apache.servicecomb.foundation.protobuf.RootSerializer;
+import org.apache.servicecomb.foundation.protobuf.internal.ProtoConst;
+
+import io.protostuff.CustomSchema;
+import io.protostuff.Input;
+import io.protostuff.Output;
+
+public class AnyEntrySchema extends CustomSchema<Object> {
+  private final ProtoMapper protoMapper;
+
+  public AnyEntrySchema(ProtoMapper protoMapper) {
+    super(null);
+    this.protoMapper = protoMapper;
+  }
+
+  @Override
+  public boolean isInitialized(Object message) {
+    return true;
+  }
+
+  @Override
+  public Object newMessage() {
+    return new AnyEntry();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    input.readFieldNumber(null);
+    String typeUrl = input.readString();
+
+    input.readFieldNumber(null);
+    byte[] bytes = input.readByteArray();
+
+    input.readFieldNumber(null);
+
+    AnyEntry anyEntry = (AnyEntry) message;
+    anyEntry.setTypeUrl(typeUrl);
+    anyEntry.setValue(bytes);
+  }
+
+  protected String getInputActualTypeName(Object input) {
+    if (!(input instanceof Map)) {
+      return input.getClass().getSimpleName();
+    }
+
+    // @JsonTypeInfo(use = Id.NAME)
+    Object actualTypeName = ((Map<?, ?>) input).get(ProtoConst.JSON_ID_NAME);
+    if (actualTypeName != null && actualTypeName instanceof String) {
+      return (String) actualTypeName;
+    }
+
+    return null;
+  }
+
+  /**
+   * <pre>
+   * if message is type of CustomGeneric&lt;User&gt;
+   * we can not get any information of "User" from message.getClass()
+   *
+   * when use with ServiceComb
+   * proto definition convert from swagger, the proto type will be "CustomGenericUser"
+   * is not match to "CustomGeneric"
+   * so message will be serialized with json schema
+   * </pre>
+   * @param output
+   * @param message
+   * @throws IOException
+   */
+  @Override
+  public void writeTo(Output output, Object message) throws IOException {
+    String actualTypeName = getInputActualTypeName(message);
+    RootSerializer actualValueSerializer = protoMapper.findRootSerializer(actualTypeName);
+    if (actualValueSerializer != null) {
+      standardPack(output, message, actualValueSerializer);
+      return;
+    }
+
+    // not standard, protobuf can not support or not define this type , just extend
+    jsonExtend(output, message);
+  }
+
+  protected void standardPack(Output output, Object message, RootSerializer actualValueSerializer) throws IOException {
+    output.writeString(1,
+        ProtoConst.PACK_SCHEMA + actualValueSerializer.getSchema().getMessage().getCanonicalName(),
+        false);
+
+    byte[] bytes = actualValueSerializer.serialize(message);
+    output.writeByteArray(2, bytes, false);
+  }
+
+  protected void jsonExtend(Output output, Object input) throws IOException {
+    output.writeString(1, ProtoConst.JSON_SCHEMA + input.getClass().getName(), false);
+
+    byte[] bytes = protoMapper.getJsonMapper().writeValueAsBytes(input);
+    output.writeByteArray(2, bytes, false);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnySchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnySchema.java
new file mode 100644
index 000000000..cae8c3600
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/AnySchema.java
@@ -0,0 +1,102 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
+import org.apache.servicecomb.foundation.protobuf.RootDeserializer;
+import org.apache.servicecomb.foundation.protobuf.internal.ProtoConst;
+
+import com.fasterxml.jackson.databind.JavaType;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+import io.protostuff.compiler.model.Message;
+
+public class AnySchema extends FieldSchema {
+  private final ProtoMapper protoMapper;
+
+  private final AnyEntrySchema anyEntrySchema;
+
+  // key is message canonical name
+  private final Map<String, RootDeserializer> rootDeserializers = new ConcurrentHashMapEx<>();
+
+  public AnySchema(ProtoMapper protoMapper, Field protoField) {
+    super(protoField);
+    this.protoMapper = protoMapper;
+    this.anyEntrySchema = new AnyEntrySchema(protoMapper);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    AnyEntry anyEntry = (AnyEntry) input.mergeObject(null, anyEntrySchema);
+    if (anyEntry.getTypeUrl().startsWith(ProtoConst.PACK_SCHEMA)) {
+      return standardUnpack(anyEntry.getTypeUrl(), anyEntry.getValue());
+    }
+
+    return jsonExtendMergeFrom(anyEntry.getTypeUrl(), anyEntry.getValue());
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    Object anyValue = readFrom(input);
+    setter.set(message, anyValue);
+  }
+
+  @SuppressWarnings("unchecked")
+  protected Object standardUnpack(String typeUrl, byte[] bytes) throws IOException {
+    String msgCanonicalName = typeUrl.substring(ProtoConst.PACK_SCHEMA.length());
+    RootDeserializer valueDeserializer = rootDeserializers
+        .computeIfAbsent(msgCanonicalName, this::createRootDeserializerFromCanonicaName);
+    Object value = valueDeserializer.deserialize(bytes);
+    if (value instanceof Map) {
+      ((Map<String, Object>) value).put(ProtoConst.JSON_ID_NAME, valueDeserializer.getSchema().messageName());
+    }
+    return value;
+  }
+
+  protected RootDeserializer createRootDeserializerFromCanonicaName(String msgCanonicalName) {
+    Message message = protoMapper.getMessageFromCanonicaName(msgCanonicalName);
+    if (message == null) {
+      throw new IllegalStateException(
+          "can not find proto message to create deserializer, name=" + msgCanonicalName);
+    }
+
+    JavaType javaType = protoMapper.getAnyTypes().get(msgCanonicalName);
+    if (javaType == null) {
+      javaType = ProtoConst.MAP_TYPE;
+    }
+    return protoMapper.createRootDeserializer(javaType, message);
+  }
+
+  protected Object jsonExtendMergeFrom(String typeUrl, byte[] bytes) throws IOException {
+    return protoMapper.getJsonMapper().readValue(bytes, Object.class);
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    output.writeObject(number, value, anyEntrySchema, repeated);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/FieldSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/FieldSchema.java
new file mode 100644
index 000000000..ad83bf0c9
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/FieldSchema.java
@@ -0,0 +1,114 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.Setter;
+import org.apache.servicecomb.foundation.protobuf.internal.bean.BeanFactory;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.serializer.ProtoStreamOutput;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.Pipe;
+import io.protostuff.compiler.model.Field;
+import io.protostuff.compiler.model.Type;
+
+public abstract class FieldSchema extends io.protostuff.runtime.Field<Object> {
+  protected final Field protoField;
+
+  protected Getter getter;
+
+  protected Setter setter;
+
+  protected BeanFactory factory;
+
+  public FieldSchema(Field protoField) {
+    super(ProtoSchemaUtils.convert(protoField.getType()),
+        protoField.getTag(),
+        protoField.getName(),
+        protoField.isRepeated(),
+        null);
+    this.protoField = protoField;
+  }
+
+  public Field getProtoField() {
+    return protoField;
+  }
+
+  public Getter getGetter() {
+    return getter;
+  }
+
+  public void setGetter(Getter getter) {
+    this.getter = getter;
+  }
+
+  public Setter getSetter() {
+    return setter;
+  }
+
+  public void setSetter(Setter setter) {
+    this.setter = setter;
+  }
+
+  public void setFactory(BeanFactory factory) {
+    this.factory = factory;
+  }
+
+  protected void throwNotSupportValue(Object value) throws IllegalStateException {
+    throw new IllegalStateException(
+        String.format("not support serialize from %s to proto %s, field=%s:%s",
+            value.getClass().getName(),
+            protoField.getTypeName(),
+            ((Type) protoField.getParent()).getCanonicalName(),
+            protoField.getName()));
+  }
+
+  @SuppressWarnings("unchecked")
+  protected <T> T getOrCreateFieldValue(Object message) {
+    Object value = getter.get(message);
+    if (value == null) {
+      value = this.factory.create();
+      setter.set(message, value);
+    }
+    return (T) value;
+  }
+
+  @Override
+  protected void transfer(Pipe pipe, Input input, Output output, boolean repeated) {
+    throw new UnsupportedOperationException();
+  }
+
+  public abstract Object readFrom(Input input) throws IOException;
+
+  @VisibleForTesting
+  public byte[] writeTo(Object message) throws IOException {
+    ProtoStreamOutput output = new ProtoStreamOutput();
+    writeTo(output, message);
+    return output.toBytes();
+  }
+
+  @Override
+  public abstract void writeTo(Output output, Object message) throws IOException;
+
+  @Override
+  public abstract void mergeFrom(Input input, Object message) throws IOException;
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MapEntrySchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MapEntrySchema.java
new file mode 100644
index 000000000..a969f25d6
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MapEntrySchema.java
@@ -0,0 +1,63 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import io.protostuff.CustomSchema;
+import io.protostuff.Input;
+import io.protostuff.Output;
+
+public class MapEntrySchema extends CustomSchema<Object> {
+  private final FieldSchema keySchema;
+
+  private final FieldSchema valueSchema;
+
+  public MapEntrySchema(FieldSchema keySchema, FieldSchema valueSchema) {
+    super(null);
+    this.keySchema = keySchema;
+    this.valueSchema = valueSchema;
+  }
+
+  @Override
+  public boolean isInitialized(Object message) {
+    return true;
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    input.readFieldNumber(null);
+    Object key = keySchema.readFrom(input);
+
+    input.readFieldNumber(null);
+    Object value = valueSchema.readFrom(input);
+
+    input.readFieldNumber(null);
+
+    ((Map<Object, Object>) message).put(key, value);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void writeTo(Output output, Object message) throws IOException {
+    keySchema.writeTo(output, ((Entry<Object, Object>) message).getKey());
+    valueSchema.writeTo(output, ((Entry<Object, Object>) message).getValue());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MapSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MapSchema.java
new file mode 100644
index 000000000..bee0e4b2a
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MapSchema.java
@@ -0,0 +1,62 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class MapSchema extends FieldSchema {
+  private final MapEntrySchema entrySchema;
+
+  public MapSchema(Field protoField, FieldSchema keySchema, FieldSchema valueSchema) {
+    super(protoField);
+    this.entrySchema = new MapEntrySchema(keySchema, valueSchema);
+  }
+
+  @Override
+  public Object readFrom(Input input) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    Map<Object, Object> map = getOrCreateFieldValue(message);
+    input.mergeObject(map, entrySchema);
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    @SuppressWarnings("unchecked")
+    Map<Object, Object> map = (Map<Object, Object>) value;
+    for (Entry<Object, Object> entry : map.entrySet()) {
+      if (entry.getKey() == null || entry.getValue() == null) {
+        continue;
+      }
+
+      output.writeObject(number, entry, entrySchema, true);
+    }
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MessageAsFieldSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MessageAsFieldSchema.java
new file mode 100644
index 000000000..6ab4b8e68
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/MessageAsFieldSchema.java
@@ -0,0 +1,50 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.io.IOException;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.Schema;
+import io.protostuff.compiler.model.Field;
+
+public class MessageAsFieldSchema extends FieldSchema {
+  private Schema<Object> schema;
+
+  public MessageAsFieldSchema(Field protoField, Schema<Object> schema) {
+    super(protoField);
+    this.schema = schema;
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    output.writeObject(number, value, schema, false);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.mergeObject(null, schema);
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    Object existing = getter.get(message);
+    Object fieldValue = input.mergeObject(existing, schema);
+    setter.set(message, fieldValue);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/ProtoSchemaUtils.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/ProtoSchemaUtils.java
new file mode 100644
index 000000000..f6e1d4edb
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/ProtoSchemaUtils.java
@@ -0,0 +1,71 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import io.protostuff.WireFormat.FieldType;
+import io.protostuff.compiler.model.ScalarFieldType;
+
+public final class ProtoSchemaUtils {
+  public static FieldType convert(io.protostuff.compiler.model.FieldType fieldType) {
+    if (fieldType.isEnum()) {
+      return FieldType.ENUM;
+    }
+
+    if (fieldType.isScalar()) {
+      switch ((ScalarFieldType) fieldType) {
+        case INT32:
+          return FieldType.INT32;
+        case INT64:
+          return FieldType.INT64;
+        case UINT32:
+          return FieldType.UINT32;
+        case UINT64:
+          return FieldType.UINT64;
+        case SINT32:
+          return FieldType.SINT32;
+        case SINT64:
+          return FieldType.SINT64;
+        case FIXED32:
+          return FieldType.FIXED32;
+        case FIXED64:
+          return FieldType.FIXED64;
+        case SFIXED32:
+          return FieldType.SFIXED32;
+        case SFIXED64:
+          return FieldType.SFIXED64;
+        case FLOAT:
+          return FieldType.FLOAT;
+        case DOUBLE:
+          return FieldType.DOUBLE;
+        case BOOL:
+          return FieldType.BOOL;
+        case STRING:
+          return FieldType.STRING;
+        case BYTES:
+          return FieldType.BYTES;
+        default:
+          throw new IllegalStateException("bug: miss process of " + fieldType);
+      }
+    }
+
+    if (fieldType.isMessage()) {
+      return FieldType.MESSAGE;
+    }
+    
+    throw new IllegalStateException("bug: miss process of " + fieldType);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/RepeatedSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/RepeatedSchema.java
new file mode 100644
index 000000000..fad456438
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/RepeatedSchema.java
@@ -0,0 +1,69 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class RepeatedSchema extends FieldSchema {
+  private final FieldSchema elementSchema;
+
+  public RepeatedSchema(Field protoField, FieldSchema elementSchema) {
+    super(protoField);
+    this.elementSchema = elementSchema;
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Collection) {
+      @SuppressWarnings("unchecked")
+      Collection<Object> list = (Collection<Object>) value;
+      for (Object element : list) {
+        elementSchema.writeTo(output, element);
+      }
+      return;
+    }
+
+    if (value.getClass().isArray()) {
+      for (Object element : (Object[]) value) {
+        elementSchema.writeTo(output, element);
+      }
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+
+  @Override
+  public Object readFrom(Input input) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    Collection<Object> collection = getOrCreateFieldValue(message);
+    collection.add(elementSchema.readFrom(input));
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/SchemaCreateContext.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/SchemaCreateContext.java
new file mode 100644
index 000000000..f30cb88ba
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/SchemaCreateContext.java
@@ -0,0 +1,43 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import io.protostuff.runtime.MessageSchema;
+
+public class SchemaCreateContext {
+  // key is short message name
+  private Map<String, MessageSchema> schemas = new HashMap<>();
+
+//  private List<MessageAsFieldSchema> messageAsFieldSchemas = new ArrayList<>();
+
+  public Map<String, MessageSchema> getSchemas() {
+    return schemas;
+  }
+
+//  public void addMessageAsFieldSchema(MessageAsFieldSchema messageAsFieldSchema) {
+//    messageAsFieldSchemas.add(messageAsFieldSchema);
+//  }
+
+//  public void resolvePlaceholders() {
+//    for (MessageAsFieldSchema messageAsFieldSchema : messageAsFieldSchemas) {
+//      messageAsFieldSchema.resolvePlaceholder();
+//    }
+//  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/SchemaManager.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/SchemaManager.java
new file mode 100644
index 000000000..49e8c9a51
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/SchemaManager.java
@@ -0,0 +1,90 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.BoolSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.BytesSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.DoubleSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.Fixed32Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.Fixed64Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.FloatSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.Int32Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.Int64Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.SFixed32Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.SFixed64Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.SInt32Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.SInt64Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.StringSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.UInt32Schema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.scalar.UInt64Schema;
+
+import io.protostuff.compiler.model.Field;
+import io.protostuff.compiler.model.Proto;
+import io.protostuff.compiler.model.ScalarFieldType;
+
+public class SchemaManager {
+  protected final ProtoMapper protoMapper;
+
+  protected final Proto proto;
+
+  public SchemaManager(ProtoMapper protoMapper) {
+    this.protoMapper = protoMapper;
+    this.proto = protoMapper.getProto();
+  }
+
+  protected boolean isAnyField(Field protoField, boolean repeated) {
+    return !repeated && protoField.getType().getCanonicalName().equals("google.protobuf.Any");
+  }
+
+  protected FieldSchema createScalarField(Field protoField) {
+    switch ((ScalarFieldType) protoField.getType()) {
+      case INT32:
+        return new Int32Schema(protoField);
+      case UINT32:
+        return new UInt32Schema(protoField);
+      case SINT32:
+        return new SInt32Schema(protoField);
+      case FIXED32:
+        return new Fixed32Schema(protoField);
+      case SFIXED32:
+        return new SFixed32Schema(protoField);
+      case INT64:
+        return new Int64Schema(protoField);
+      case UINT64:
+        return new UInt64Schema(protoField);
+      case SINT64:
+        return new SInt64Schema(protoField);
+      case FIXED64:
+        return new Fixed64Schema(protoField);
+      case SFIXED64:
+        return new SFixed64Schema(protoField);
+      case FLOAT:
+        return new FloatSchema(protoField);
+      case DOUBLE:
+        return new DoubleSchema(protoField);
+      case BOOL:
+        return new BoolSchema(protoField);
+      case STRING:
+        return new StringSchema(protoField);
+      case BYTES:
+        return new BytesSchema(protoField);
+      default:
+        throw new IllegalStateException("unknown proto field type: " + protoField.getType());
+    }
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/DeserializerSchemaManager.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/DeserializerSchemaManager.java
new file mode 100644
index 000000000..b42efc089
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/DeserializerSchemaManager.java
@@ -0,0 +1,183 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.deserializer;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.common.utils.bean.MapGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.MapSetter;
+import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
+import org.apache.servicecomb.foundation.protobuf.RootDeserializer;
+import org.apache.servicecomb.foundation.protobuf.internal.bean.BeanDescriptor;
+import org.apache.servicecomb.foundation.protobuf.internal.bean.BeanFactory;
+import org.apache.servicecomb.foundation.protobuf.internal.bean.PropertyDescriptor;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.AnySchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.MapSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.MessageAsFieldSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.RepeatedSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.SchemaCreateContext;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.SchemaManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.JavaType;
+
+import io.protostuff.compiler.model.Field;
+import io.protostuff.compiler.model.Message;
+import io.protostuff.runtime.MessageSchema;
+import io.protostuff.runtime.RuntimeEnv;
+
+public class DeserializerSchemaManager extends SchemaManager {
+  private static final Logger LOGGER = LoggerFactory.getLogger(DeserializerSchemaManager.class);
+
+  public DeserializerSchemaManager(ProtoMapper protoMapper) {
+    super(protoMapper);
+  }
+
+  public RootDeserializer createRootDeserializer(JavaType javaType, String shortMessageName) {
+    Message message = proto.getMessage(shortMessageName);
+    if (message == null) {
+      throw new IllegalStateException("can not find proto message to create deserializer, name=" + shortMessageName);
+    }
+
+    return createRootDeserializer(javaType, message);
+  }
+
+  public RootDeserializer createRootDeserializer(JavaType javaType, Message message) {
+    SchemaCreateContext context = new SchemaCreateContext();
+    MessageSchema schema = createSchema(context, javaType, message);
+
+    BeanDescriptor beanDescriptor = protoMapper.getBeanDescriptorManager().getOrCreateBeanDescriptor(javaType);
+    return new RootDeserializer(beanDescriptor, schema);
+  }
+
+  protected MessageSchema createSchema(SchemaCreateContext context, JavaType javaType,
+      Message message) {
+    MessageSchema schema = context.getSchemas().get(message.getName());
+    if (schema != null) {
+      return schema;
+    }
+
+    schema = new MessageSchema();
+    context.getSchemas().put(message.getName(), schema);
+
+    doCreateSchema(context, schema, javaType, message);
+    return schema;
+  }
+
+  @SuppressWarnings("unchecked")
+  protected void doCreateSchema(SchemaCreateContext context, MessageSchema schema,
+      JavaType javaType,
+      Message message) {
+    if (Map.class.isAssignableFrom(javaType.getRawClass())) {
+      doCreateSchemaToMap(context, schema, javaType, message);
+      return;
+    }
+
+    BeanDescriptor beanDescriptor = protoMapper.getBeanDescriptorManager().getOrCreateBeanDescriptor(javaType);
+
+    List<io.protostuff.runtime.Field<Object>> fieldSchemas = new ArrayList<>();
+    for (PropertyDescriptor propertyDescriptor : beanDescriptor.getPropertyDescriptors().values()) {
+      Field protoField = message.getField(propertyDescriptor.getName());
+      if (protoField == null) {
+        LOGGER.info("java field {}:{} not exist in proto message {}, ignore it.",
+            beanDescriptor.getJavaType().getRawClass().getName(),
+            propertyDescriptor.getName(), message.getCanonicalName());
+        continue;
+      }
+      if (propertyDescriptor.getSetter() == null) {
+        LOGGER.info("no setter for java field {}:{} in proto message {}, ignore it.",
+            beanDescriptor.getJavaType().getRawClass().getName(),
+            propertyDescriptor.getName(), message.getCanonicalName());
+        continue;
+      }
+
+      FieldSchema fieldSchema = createSchemaField(context, propertyDescriptor.getJavaType(), protoField,
+          protoField.isRepeated());
+      fieldSchema.setGetter(propertyDescriptor.getGetter());
+      fieldSchema.setSetter(propertyDescriptor.getSetter());
+      if (isAnyField(protoField, protoField.isRepeated())) {
+        fieldSchema.setFactory(BeanFactory::mapFactory);
+      } else {
+        fieldSchema.setFactory(propertyDescriptor.getFactory());
+      }
+      fieldSchemas.add(fieldSchema);
+    }
+
+    schema.init(protoMapper, (Class<Object>) javaType.getRawClass(),
+        fieldSchemas,
+        RuntimeEnv.newInstantiator((Class<Object>) javaType.getRawClass()), message);
+  }
+
+  @SuppressWarnings("unchecked")
+  protected void doCreateSchemaToMap(SchemaCreateContext context,
+      MessageSchema schema, JavaType mapJavaType,
+      Message message) {
+    List<io.protostuff.runtime.Field<Object>> fieldSchemas = new ArrayList<>();
+    for (Field protoField : message.getFields()) {
+      FieldSchema fieldSchema = createSchemaField(context, mapJavaType, protoField, protoField.isRepeated());
+      fieldSchema.setGetter(new MapGetter(protoField.getName()));
+      fieldSchema.setSetter(new MapSetter(protoField.getName()));
+      fieldSchema.setFactory(BeanFactory.createFactory(protoField));
+      fieldSchemas.add(fieldSchema);
+    }
+
+    schema.init(protoMapper, (Class<Object>) mapJavaType.getRawClass(),
+        fieldSchemas,
+        RuntimeEnv.newInstantiator((Class<Object>) (Object) LinkedHashMap.class), message);
+  }
+
+  protected FieldSchema createSchemaField(SchemaCreateContext context, JavaType javaType, Field protoField,
+      boolean repeated) {
+    if (protoField.isMap()) {
+      Message entryMessage = (Message) protoField.getType();
+      FieldSchema keySchema = createSchemaField(context, javaType.getKeyType(), entryMessage.getField(1), false);
+      FieldSchema valueSchema = createSchemaField(context, javaType.getContentType(), entryMessage.getField(2), false);
+      return new MapSchema(protoField, keySchema, valueSchema);
+    }
+
+    if (protoField.isOneofPart()) {
+      throw new IllegalStateException("not IMPL oneof  now.");
+    }
+
+    if (repeated) {
+      FieldSchema schema = createSchemaField(context, javaType.getContentType(), protoField, false);
+      return new RepeatedSchema(protoField, schema);
+    }
+
+    if (isAnyField(protoField, repeated)) {
+      return new AnySchema(protoMapper, protoField);
+    }
+
+    if (protoField.getType().isEnum()) {
+      return new EnumDeserializerSchema(protoField, javaType);
+    }
+
+    if (protoField.getType().isScalar()) {
+      return createScalarField(protoField);
+    }
+
+    // message
+    MessageSchema messageSchema = createSchema(context, javaType, (Message) protoField.getType());
+    MessageAsFieldSchema messageAsFieldSchema = new MessageAsFieldSchema(protoField, messageSchema);
+    return messageAsFieldSchema;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/EnumDeserializerSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/EnumDeserializerSchema.java
new file mode 100644
index 000000000..943372dab
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/EnumDeserializerSchema.java
@@ -0,0 +1,96 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.deserializer;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import com.fasterxml.jackson.databind.JavaType;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+import io.protostuff.compiler.model.Type;
+
+public class EnumDeserializerSchema extends FieldSchema {
+  private final JavaType javaType;
+
+  private Map<Integer, Enum<?>> enumValues = new HashMap<>();
+
+  public EnumDeserializerSchema(Field protoField, JavaType javaType) {
+    super(protoField);
+    this.javaType = javaType;
+
+    if (!javaType.isEnumType()) {
+      return;
+    }
+
+    try {
+      Method method = javaType.getRawClass().getMethod("values");
+      method.setAccessible(true);
+      Object[] values = (Object[]) method.invoke(null);
+      for (Object value : values) {
+        Enum<?> enumValue = (Enum<?>) value;
+        enumValues.put(enumValue.ordinal(), enumValue);
+      }
+    } catch (Throwable e) {
+      throw new IllegalStateException(
+          "Failed to collect enum values, class=" + javaType.getRawClass().getName(), e);
+    }
+  }
+
+  @Override
+  public void writeTo(Output output, Object message) throws IOException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    int ordinal = input.readInt32();
+    if (javaType.isEnumType()) {
+      return enumValues.get(ordinal);
+    }
+
+    return ordinal;
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    int ordinal = input.readInt32();
+
+    if (javaType.isEnumType()) {
+      Enum<?> enumValue = enumValues.get(ordinal);
+      if (enumValue != null) {
+        setter.set(message, enumValue);
+        return;
+      }
+
+      throw new IllegalStateException(
+          String.format("invalid enum ordinal value %d for %s, proto field=%s:%s",
+              ordinal,
+              javaType.getRawClass().getName(),
+              ((Type) protoField.getParent()).getCanonicalName(),
+              protoField.getName()));
+    }
+
+    setter.set(message, ordinal);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/BoolSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/BoolSchema.java
new file mode 100644
index 000000000..3d5fc604c
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/BoolSchema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class BoolSchema extends FieldSchema {
+  public BoolSchema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readBool();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readBool());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Boolean) {
+      output.writeBool(number, (Boolean) value, repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      boolean v = Boolean.parseBoolean(((String[]) value)[0]);
+      output.writeBool(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      boolean v = Boolean.parseBoolean((String) value);
+      output.writeBool(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/BytesSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/BytesSchema.java
new file mode 100644
index 000000000..e354c7eef
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/BytesSchema.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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class BytesSchema extends FieldSchema {
+  public BytesSchema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readByteArray();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readByteArray());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof byte[]) {
+      output.writeByteArray(number, (byte[]) value, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/DoubleSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/DoubleSchema.java
new file mode 100644
index 000000000..45dbce32e
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/DoubleSchema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class DoubleSchema extends FieldSchema {
+  public DoubleSchema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readDouble();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readDouble());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeDouble(number, ((Number) value).doubleValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      double v = Double.parseDouble(((String[]) value)[0]);
+      output.writeDouble(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      double v = Double.parseDouble((String) value);
+      output.writeDouble(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Fixed32Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Fixed32Schema.java
new file mode 100644
index 000000000..168f39dc8
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Fixed32Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class Fixed32Schema extends FieldSchema {
+  public Fixed32Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeFixed32(number, ((Number) value).intValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      int v = Integer.parseInt(((String[]) value)[0], 10);
+      output.writeFixed32(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      int v = Integer.parseInt((String) value, 10);
+      output.writeFixed32(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readFixed32();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readFixed32());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Fixed64Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Fixed64Schema.java
new file mode 100644
index 000000000..36138d070
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Fixed64Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class Fixed64Schema extends FieldSchema {
+  public Fixed64Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readFixed64();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readFixed64());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeFixed64(number, ((Number) value).longValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      long v = Long.parseLong(((String[]) value)[0], 10);
+      output.writeFixed64(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      long v = Long.parseLong((String) value, 10);
+      output.writeFixed64(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/FloatSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/FloatSchema.java
new file mode 100644
index 000000000..d587d40d0
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/FloatSchema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class FloatSchema extends FieldSchema {
+  public FloatSchema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readFloat();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readFloat());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeFloat(number, ((Number) value).floatValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      float v = Float.parseFloat(((String[]) value)[0]);
+      output.writeFloat(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      float v = Float.parseFloat((String) value);
+      output.writeFloat(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Int32Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Int32Schema.java
new file mode 100644
index 000000000..526e85084
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Int32Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class Int32Schema extends FieldSchema {
+  public Int32Schema(Field protoField) {
+    super(protoField);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readInt32();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readInt32());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeInt32(number, ((Number) value).intValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      int v = Integer.parseInt(((String[]) value)[0], 10);
+      output.writeInt32(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      int v = Integer.parseInt((String) value, 10);
+      output.writeInt32(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Int64Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Int64Schema.java
new file mode 100644
index 000000000..91b6d61a3
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/Int64Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class Int64Schema extends FieldSchema {
+  public Int64Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readInt64();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readInt64());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeInt64(number, ((Number) value).longValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      long v = Long.parseLong(((String[]) value)[0], 10);
+      output.writeInt64(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      long v = Long.parseLong((String) value, 10);
+      output.writeInt64(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SFixed32Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SFixed32Schema.java
new file mode 100644
index 000000000..c51758db2
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SFixed32Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class SFixed32Schema extends FieldSchema {
+  public SFixed32Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readSFixed32();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readSFixed32());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeSFixed32(number, ((Number) value).intValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      int v = Integer.parseInt(((String[]) value)[0], 10);
+      output.writeSFixed32(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      int v = Integer.parseInt((String) value, 10);
+      output.writeSFixed32(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SFixed64Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SFixed64Schema.java
new file mode 100644
index 000000000..97502ad6c
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SFixed64Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class SFixed64Schema extends FieldSchema {
+  public SFixed64Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readSFixed64();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readSFixed64());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeSFixed64(number, ((Number) value).longValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      long v = Long.parseLong(((String[]) value)[0], 10);
+      output.writeSFixed64(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      long v = Long.parseLong((String) value, 10);
+      output.writeSFixed64(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SInt32Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SInt32Schema.java
new file mode 100644
index 000000000..602ba082a
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SInt32Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class SInt32Schema extends FieldSchema {
+  public SInt32Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readSInt32();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readSInt32());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeSInt32(number, ((Number) value).intValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      int v = Integer.parseInt(((String[]) value)[0], 10);
+      output.writeSInt32(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      int v = Integer.parseInt((String) value, 10);
+      output.writeSInt32(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SInt64Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SInt64Schema.java
new file mode 100644
index 000000000..2401b80de
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/SInt64Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class SInt64Schema extends FieldSchema {
+  public SInt64Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readSInt64();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readSInt64());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeSInt64(number, ((Number) value).longValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      long v = Long.parseLong(((String[]) value)[0], 10);
+      output.writeSInt64(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      long v = Long.parseLong((String) value, 10);
+      output.writeSInt64(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/StringSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/StringSchema.java
new file mode 100644
index 000000000..1b15520b9
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/StringSchema.java
@@ -0,0 +1,63 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class StringSchema extends FieldSchema {
+  public StringSchema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readString();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readString());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof String) {
+      output.writeString(number, (String) value, repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      output.writeString(number, ((String[]) value)[0], repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/UInt32Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/UInt32Schema.java
new file mode 100644
index 000000000..215fccba0
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/UInt32Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class UInt32Schema extends FieldSchema {
+  public UInt32Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readUInt32();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readUInt32());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeUInt32(number, ((Number) value).intValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      int v = Integer.parseInt(((String[]) value)[0], 10);
+      output.writeUInt32(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      int v = Integer.parseInt((String) value, 10);
+      output.writeUInt32(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/UInt64Schema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/UInt64Schema.java
new file mode 100644
index 000000000..4c57d293a
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/UInt64Schema.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.Field;
+
+public class UInt64Schema extends FieldSchema {
+  public UInt64Schema(Field field) {
+    super(field);
+  }
+
+  @Override
+  public Object readFrom(Input input) throws IOException {
+    return input.readUInt64();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) throws IOException {
+    setter.set(message, input.readUInt64());
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Number) {
+      output.writeUInt64(number, ((Number) value).longValue(), repeated);
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+      long v = Long.parseLong(((String[]) value)[0], 10);
+      output.writeUInt64(number, v, repeated);
+      return;
+    }
+
+    if (value instanceof String) {
+      long v = Long.parseLong((String) value, 10);
+      output.writeUInt64(number, v, repeated);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/EnumSerializerSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/EnumSerializerSchema.java
new file mode 100644
index 000000000..31f3862a2
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/EnumSerializerSchema.java
@@ -0,0 +1,122 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.serializer;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Input;
+import io.protostuff.Output;
+import io.protostuff.compiler.model.EnumConstant;
+import io.protostuff.compiler.model.Field;
+import io.protostuff.compiler.model.Type;
+
+public class EnumSerializerSchema extends FieldSchema {
+  private Map<String, Integer> enumNameToValueMap = new HashMap<>();
+
+  private Set<Integer> enumValueSet = new HashSet<>();
+
+  public EnumSerializerSchema(Field field) {
+    super(field);
+    io.protostuff.compiler.model.Enum enumType = (io.protostuff.compiler.model.Enum) field.getType();
+    for (EnumConstant enumConstant : enumType.getConstants()) {
+      enumNameToValueMap.put(enumConstant.getName(), enumConstant.getValue());
+      enumValueSet.add(enumConstant.getValue());
+    }
+  }
+
+  @Override
+  public void writeTo(Output output, Object value) throws IOException {
+    if (value == null) {
+      return;
+    }
+
+    if (value instanceof Enum) {
+      // already be a Enum, need to check if it is a valid Enum?
+      // wrong case:
+      //   expect a Color enum, but be a Sharp enum?, who will do this?
+      // for safe, check it......
+      serializeFromString(output, ((Enum<?>) value).name());
+      return;
+    }
+
+    if (value instanceof Number) {
+      // need to check if it is a valid number
+      // because maybe come from http request
+      serializeFromNumber(output, ((Number) value).intValue());
+      return;
+    }
+
+    if (value instanceof String[]) {
+      if (((String[]) value).length == 0) {
+        return;
+      }
+
+      serializeFromString(output, ((String[]) value)[0]);
+      return;
+    }
+
+    if (value instanceof String) {
+      serializeFromString(output, (String) value);
+      return;
+    }
+
+    throwNotSupportValue(value);
+  }
+
+
+  protected void serializeFromNumber(Output output, int enumValue) throws IOException {
+    if (!enumValueSet.contains(enumValue)) {
+      throw new IllegalStateException(
+          String.format("invalid enum value %d for proto %s, field=%s:%s",
+              enumValue,
+              protoField.getTypeName(),
+              ((Type) protoField.getParent()).getCanonicalName(),
+              protoField.getName()));
+    }
+
+    output.writeInt32(number, enumValue, repeated);
+  }
+
+  protected void serializeFromString(Output output, String enumName) throws IOException {
+    Integer v = enumNameToValueMap.get(enumName);
+    if (v == null) {
+      throw new IllegalStateException(
+          String.format("invalid enum name %s for proto %s, field=%s:%s",
+              enumName,
+              protoField.getTypeName(),
+              ((Type) protoField.getParent()).getCanonicalName(),
+              protoField.getName()));
+    }
+    output.writeInt32(number, v, repeated);
+  }
+
+  @Override
+  public Object readFrom(Input input) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void mergeFrom(Input input, Object message) {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/PojoFieldSerializer.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/PojoFieldSerializer.java
new file mode 100644
index 000000000..baa2b9cc4
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/PojoFieldSerializer.java
@@ -0,0 +1,45 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.serializer;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+
+import io.protostuff.Output;
+
+public class PojoFieldSerializer {
+  private final Getter getter;
+
+  private final FieldSchema fieldSchema;
+
+  public PojoFieldSerializer(Getter getter, FieldSchema fieldSchema) {
+    this.getter = getter;
+    this.fieldSchema = fieldSchema;
+  }
+
+
+  public void writeTo(Output output, Object instance) throws IOException {
+    Object value = getter.get(instance);
+    if (value == null) {
+      return;
+    }
+
+    fieldSchema.writeTo(output, value);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/ProtoStreamOutput.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/ProtoStreamOutput.java
new file mode 100644
index 000000000..d6e45cb40
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/ProtoStreamOutput.java
@@ -0,0 +1,154 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.serializer;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import io.protostuff.ByteString;
+import io.protostuff.LinkedBuffer;
+import io.protostuff.Output;
+import io.protostuff.ProtobufOutput;
+import io.protostuff.Schema;
+
+public class ProtoStreamOutput implements Output {
+  private final LinkedBuffer linkedBuffer = LinkedBuffer.allocate();
+
+  private final ProtobufOutput output = new ProtobufOutput(linkedBuffer);
+
+  public byte[] toBytes() {
+    return output.toByteArray();
+  }
+
+  public final void writeInt64(int fieldNumber, long value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeInt64(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeUInt64(int fieldNumber, long value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeUInt64(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeSInt64(int fieldNumber, long value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeSInt64(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeFixed64(int fieldNumber, long value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeFixed64(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeSFixed64(int fieldNumber, long value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeSFixed64(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeInt32(int fieldNumber, int value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeInt32(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeUInt32(int fieldNumber, int value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeUInt32(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeSInt32(int fieldNumber, int value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeSInt32(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeFixed32(int fieldNumber, int value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeFixed32(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeSFixed32(int fieldNumber, int value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeSFixed32(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeFloat(int fieldNumber, float value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeFloat(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeDouble(int fieldNumber, double value, boolean repeated) throws IOException {
+    if (value != 0) {
+      output.writeDouble(fieldNumber, value, repeated);
+    }
+  }
+
+  public final void writeBool(int fieldNumber, boolean value, boolean repeated) throws IOException {
+    if (value) {
+      output.writeBool(fieldNumber, value, repeated);
+    }
+  }
+
+  @Override
+  public void writeEnum(int fieldNumber, int value, boolean repeated) throws IOException {
+
+  }
+
+  // write from String[0], maybe null
+  public final void writeString(int fieldNumber, @Nullable String value, boolean repeated) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      output.writeString(fieldNumber, value, repeated);
+    }
+  }
+
+  @Override
+  public void writeBytes(int fieldNumber, ByteString value, boolean repeated) throws IOException {
+    output.writeBytes(fieldNumber, value, repeated);
+  }
+
+  public final void writeByteArray(int fieldNumber, @Nonnull byte[] value, boolean repeated) throws IOException {
+    output.writeByteArray(fieldNumber, value, repeated);
+  }
+
+  @Override
+  public void writeByteRange(boolean utf8String, int fieldNumber, byte[] value, int offset, int length,
+      boolean repeated) throws IOException {
+    output.writeByteRange(utf8String, fieldNumber, value, offset, length, repeated);
+  }
+
+  @Override
+  public <T> void writeObject(int fieldNumber, T value, Schema<T> schema, boolean repeated) throws IOException {
+    output.writeObject(fieldNumber, value, schema, repeated);
+  }
+
+  @Override
+  public void writeBytes(int fieldNumber, ByteBuffer value, boolean repeated) throws IOException {
+    output.writeBytes(fieldNumber, value, repeated);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/SerializerSchemaManager.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/SerializerSchemaManager.java
new file mode 100644
index 000000000..296e1bcc8
--- /dev/null
+++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/SerializerSchemaManager.java
@@ -0,0 +1,125 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.serializer;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
+import org.apache.servicecomb.foundation.protobuf.RootSerializer;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.AnySchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.MapSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.MessageAsFieldSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.RepeatedSchema;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.SchemaCreateContext;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.SchemaManager;
+
+import io.protostuff.compiler.model.Field;
+import io.protostuff.compiler.model.Message;
+import io.protostuff.runtime.MessageSchema;
+
+public class SerializerSchemaManager extends SchemaManager {
+  // key is short message name
+  private Map<String, RootSerializer> schemas = new HashMap<>();
+
+  private Map<String, RootSerializer> canonicalSchemas = new HashMap<>();
+
+  public SerializerSchemaManager(ProtoMapper protoMapper) {
+    super(protoMapper);
+
+    buildSchemas();
+  }
+
+  public RootSerializer findRootSerializer(String shortMessageName) {
+    return schemas.get(shortMessageName);
+  }
+
+  public RootSerializer findRootSerializerByCanonical(String canonicalMessageName) {
+    return canonicalSchemas.get(canonicalMessageName);
+  }
+
+  protected void buildSchemas() {
+    SchemaCreateContext context = new SchemaCreateContext();
+    for (Message message : proto.getMessages()) {
+      RootSerializer rootSerializer = createRootSerializer(context, message);
+      schemas.put(message.getName(), rootSerializer);
+      canonicalSchemas.put(message.getCanonicalName(), rootSerializer);
+    }
+  }
+
+  protected RootSerializer createRootSerializer(SchemaCreateContext context, Message message) {
+    MessageSchema schema = createSchema(context, message);
+
+    return new RootSerializer(schema);
+  }
+
+  protected MessageSchema createSchema(SchemaCreateContext context, Message message) {
+    MessageSchema schema = context.getSchemas().get(message.getName());
+    if (schema != null) {
+      return schema;
+    }
+
+    schema = new MessageSchema();
+    context.getSchemas().put(message.getName(), schema);
+
+    List<io.protostuff.runtime.Field<Object>> fieldSchemas = new ArrayList<>();
+    for (Field protoField : message.getFields()) {
+      FieldSchema fieldSchema = createSchemaField(context, protoField, protoField.isRepeated());
+      fieldSchemas.add(fieldSchema);
+    }
+    schema.init(protoMapper, fieldSchemas, message);
+    return schema;
+  }
+
+  protected FieldSchema createSchemaField(SchemaCreateContext context, Field protoField, boolean repeated) {
+    if (protoField.isMap()) {
+      Message entryMessage = (Message) protoField.getType();
+      FieldSchema keySchema = createSchemaField(context, entryMessage.getField(1), false);
+      FieldSchema valueSchema = createSchemaField(context, entryMessage.getField(2), false);
+      return new MapSchema(protoField, keySchema, valueSchema);
+    }
+
+    if (protoField.isOneofPart()) {
+      throw new IllegalStateException("not IMPL oneof  now.");
+    }
+
+    if (repeated) {
+      FieldSchema schema = createSchemaField(context, protoField, false);
+      return new RepeatedSchema(protoField, schema);
+    }
+
+    if (isAnyField(protoField, repeated)) {
+      return new AnySchema(protoMapper, protoField);
+    }
+
+    if (protoField.getType().isEnum()) {
+      return new EnumSerializerSchema(protoField);
+    }
+
+    if (protoField.getType().isScalar()) {
+      return createScalarField(protoField);
+    }
+
+    // message
+    MessageSchema messageSchema = createSchema(context, (Message) protoField.getType());
+    MessageAsFieldSchema messageAsFieldSchema = new MessageAsFieldSchema(protoField, messageSchema);
+    return messageAsFieldSchema;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestSchemaBase.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestSchemaBase.java
new file mode 100644
index 000000000..8ba7186ed
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestSchemaBase.java
@@ -0,0 +1,101 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Hex;
+import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
+import org.apache.servicecomb.foundation.protobuf.ProtoMapperFactory;
+import org.apache.servicecomb.foundation.protobuf.RootDeserializer;
+import org.apache.servicecomb.foundation.protobuf.RootSerializer;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
+import org.apache.servicecomb.foundation.protobuf.internal.model.Root;
+import org.apache.servicecomb.foundation.protobuf.internal.schema.FieldSchema;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.rules.ExpectedException;
+
+public class TestSchemaBase {
+  protected static ProtoMapperFactory factory = new ProtoMapperFactory();
+
+  protected static ProtoMapper protoMapper = factory.createFromName("protobufRoot.proto");
+
+  protected static RootSerializer rootSerializer = protoMapper.findRootSerializer("Root");
+
+  protected static RootDeserializer rootDeserializer = protoMapper.createRootDeserializer(Root.class, "Root");
+
+  protected static RootDeserializer mapRootDeserializer = protoMapper.createRootDeserializer(Map.class, "Root");
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  protected Object scbRoot;
+
+  protected byte[] scbRootBytes;
+
+  protected Map<String, Object> scbMap;
+
+  protected byte[] scbMapBytes;
+
+  protected ProtobufRoot.Root.Builder builder = ProtobufRoot.Root.newBuilder();
+
+  protected byte[] protobufBytes;
+
+  protected FieldSchema serFieldSchema;
+
+  protected FieldSchema deserFieldSchema;
+
+  protected void initField(String fieldName) {
+    serFieldSchema = (FieldSchema) rootSerializer.getSchema().getFieldByName(fieldName);
+    deserFieldSchema = (FieldSchema) rootDeserializer.getSchema().getFieldByName(fieldName);
+  }
+
+  protected void check() throws IOException {
+    check(rootDeserializer, mapRootDeserializer, rootSerializer, false);
+  }
+
+  protected void check(boolean print) throws IOException {
+    check(rootDeserializer, mapRootDeserializer, rootSerializer, print);
+  }
+
+  protected void check(RootDeserializer deserializer, RootDeserializer mapDeserializer, RootSerializer serializer,
+      boolean print) throws IOException {
+    // 1.standard protobuf serialize to bytes
+    protobufBytes = builder.build().toByteArray();
+    // 2.weak type deserialize
+    scbMap = mapDeserializer.deserialize(protobufBytes);
+    // 3.weak type serialize
+    scbMapBytes = rootSerializer.serialize(scbMap);
+    // 4.strong type deserialize
+    scbRoot = deserializer.deserialize(scbMapBytes);
+    // 5.strong type serialize
+    scbRootBytes = rootSerializer.serialize(scbRoot);
+
+    if (print) {
+      System.out.println("scbRoot bytes:" + Hex.encodeHexString(scbRootBytes));
+      System.out.println("scbRoot len  :" + scbRootBytes.length);
+      System.out.println("scbMap bytes :" + Hex.encodeHexString(scbRootBytes));
+      System.out.println("scbMap len   :" + scbRootBytes.length);
+      System.out.println("protobuf     :" + Hex.encodeHexString(protobufBytes));
+      System.out.println("protobuf len :" + protobufBytes.length);
+    }
+    Assert.assertArrayEquals(protobufBytes, scbMapBytes);
+    Assert.assertArrayEquals(protobufBytes, scbRootBytes);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/Color.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/Color.java
new file mode 100644
index 000000000..19c724f2f
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/Color.java
@@ -0,0 +1,22 @@
+package org.apache.servicecomb.foundation.protobuf.internal.model;/*
+ * 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.
+ */
+
+public enum Color {
+  RED,
+  YELLOW,
+  BLUE
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/CustomGeneric.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/CustomGeneric.java
new file mode 100644
index 000000000..5cbb1ef78
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/CustomGeneric.java
@@ -0,0 +1,21 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.model;
+
+public class CustomGeneric<T> {
+  public T user;
+}
\ No newline at end of file
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/ProtobufRoot.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/ProtobufRoot.java
new file mode 100644
index 000000000..6dbe9f0df
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/ProtobufRoot.java
@@ -0,0 +1,5033 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: protobufRoot.proto
+
+package org.apache.servicecomb.foundation.protobuf.internal.model;
+
+@SuppressWarnings("all")
+public final class ProtobufRoot {
+  private ProtobufRoot() {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+
+  /**
+   * Protobuf enum {@code org.apache.servicecomb.foundation.protobuf.internal.model.Color}
+   */
+  public enum Color
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <code>RED = 0;</code>
+     */
+    RED(0),
+    /**
+     * <code>YELLOW = 1;</code>
+     */
+    YELLOW(1),
+    /**
+     * <code>BLUE = 2;</code>
+     */
+    BLUE(2),
+    UNRECOGNIZED(-1),;
+
+    /**
+     * <code>RED = 0;</code>
+     */
+    public static final int RED_VALUE = 0;
+
+    /**
+     * <code>YELLOW = 1;</code>
+     */
+    public static final int YELLOW_VALUE = 1;
+
+    /**
+     * <code>BLUE = 2;</code>
+     */
+    public static final int BLUE_VALUE = 2;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @Deprecated
+    public static Color valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static Color forNumber(int value) {
+      switch (value) {
+        case 0:
+          return RED;
+        case 1:
+          return YELLOW;
+        case 2:
+          return BLUE;
+        default:
+          return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<Color>
+    internalGetValueMap() {
+      return internalValueMap;
+    }
+
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        Color> internalValueMap =
+        new com.google.protobuf.Internal.EnumLiteMap<Color>() {
+          public Color findValueByNumber(int number) {
+            return Color.forNumber(number);
+          }
+        };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+    getValueDescriptor() {
+      return getDescriptor().getValues().get(ordinal());
+    }
+
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+    getDescriptorForType() {
+      return getDescriptor();
+    }
+
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+    getDescriptor() {
+      return ProtobufRoot.getDescriptor().getEnumTypes().get(0);
+    }
+
+    private static final Color[] VALUES = values();
+
+    public static Color valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private Color(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:org.apache.servicecomb.foundation.protobuf.internal.model.Color)
+  }
+
+  public interface RootOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:org.apache.servicecomb.foundation.protobuf.internal.model.Root)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>int32 int32 = 1;</code>
+     */
+    int getInt32();
+
+    /**
+     * <code>int64 int64 = 2;</code>
+     */
+    long getInt64();
+
+    /**
+     * <code>uint32 uint32 = 3;</code>
+     */
+    int getUint32();
+
+    /**
+     * <code>uint64 uint64 = 4;</code>
+     */
+    long getUint64();
+
+    /**
+     * <code>sint32 sint32 = 5;</code>
+     */
+    int getSint32();
+
+    /**
+     * <code>sint64 sint64 = 6;</code>
+     */
+    long getSint64();
+
+    /**
+     * <code>fixed32 fixed32 = 7;</code>
+     */
+    int getFixed32();
+
+    /**
+     * <code>fixed64 fixed64 = 8;</code>
+     */
+    long getFixed64();
+
+    /**
+     * <code>sfixed32 sfixed32 = 9;</code>
+     */
+    int getSfixed32();
+
+    /**
+     * <code>sfixed64 sfixed64 = 10;</code>
+     */
+    long getSfixed64();
+
+    /**
+     * <code>float floatValue = 11;</code>
+     */
+    float getFloatValue();
+
+    /**
+     * <code>double doubleValue = 12;</code>
+     */
+    double getDoubleValue();
+
+    /**
+     * <code>bool bool = 13;</code>
+     */
+    boolean getBool();
+
+    /**
+     * <code>string string = 14;</code>
+     */
+    String getString();
+
+    /**
+     * <code>string string = 14;</code>
+     */
+    com.google.protobuf.ByteString
+    getStringBytes();
+
+    /**
+     * <code>bytes bytes = 15;</code>
+     */
+    com.google.protobuf.ByteString getBytes();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+     */
+    int getColorValue();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+     */
+    Color getColor();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+     */
+    boolean hasUser();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+     */
+    User getUser();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+     */
+    UserOrBuilder getUserOrBuilder();
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+    int getSsMapCount();
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+    boolean containsSsMap(
+        String key);
+
+    /**
+     * Use {@link #getSsMapMap()} instead.
+     */
+    @Deprecated
+    java.util.Map<String, String>
+    getSsMap();
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+    java.util.Map<String, String>
+    getSsMapMap();
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+
+    String getSsMapOrDefault(
+        String key,
+        String defaultValue);
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+
+    String getSsMapOrThrow(
+        String key);
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+    int getSpMapCount();
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+    boolean containsSpMap(
+        String key);
+
+    /**
+     * Use {@link #getSpMapMap()} instead.
+     */
+    @Deprecated
+    java.util.Map<String, User>
+    getSpMap();
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+    java.util.Map<String, User>
+    getSpMapMap();
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+
+    User getSpMapOrDefault(
+        String key,
+        User defaultValue);
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+
+    User getSpMapOrThrow(
+        String key);
+
+    /**
+     * <code>repeated string sList = 20;</code>
+     */
+    java.util.List<String>
+    getSListList();
+
+    /**
+     * <code>repeated string sList = 20;</code>
+     */
+    int getSListCount();
+
+    /**
+     * <code>repeated string sList = 20;</code>
+     */
+    String getSList(int index);
+
+    /**
+     * <code>repeated string sList = 20;</code>
+     */
+    com.google.protobuf.ByteString
+    getSListBytes(int index);
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    java.util.List<User>
+    getPListList();
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    User getPList(int index);
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    int getPListCount();
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    java.util.List<? extends UserOrBuilder>
+    getPListOrBuilderList();
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    UserOrBuilder getPListOrBuilder(
+        int index);
+
+    /**
+     * <code>.google.protobuf.Any any = 22;</code>
+     */
+    boolean hasAny();
+
+    /**
+     * <code>.google.protobuf.Any any = 22;</code>
+     */
+    com.google.protobuf.Any getAny();
+
+    /**
+     * <code>.google.protobuf.Any any = 22;</code>
+     */
+    com.google.protobuf.AnyOrBuilder getAnyOrBuilder();
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    java.util.List<com.google.protobuf.Any>
+    getAnysList();
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    com.google.protobuf.Any getAnys(int index);
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    int getAnysCount();
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    java.util.List<? extends com.google.protobuf.AnyOrBuilder>
+    getAnysOrBuilderList();
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    com.google.protobuf.AnyOrBuilder getAnysOrBuilder(
+        int index);
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+     */
+    boolean hasTypeRecursive();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+     */
+    Root getTypeRecursive();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+     */
+    RootOrBuilder getTypeRecursiveOrBuilder();
+  }
+
+  /**
+   * Protobuf type {@code org.apache.servicecomb.foundation.protobuf.internal.model.Root}
+   */
+  public static final class Root extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:org.apache.servicecomb.foundation.protobuf.internal.model.Root)
+      RootOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use Root.newBuilder() to construct.
+    private Root(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private Root() {
+      int32_ = 0;
+      int64_ = 0L;
+      uint32_ = 0;
+      uint64_ = 0L;
+      sint32_ = 0;
+      sint64_ = 0L;
+      fixed32_ = 0;
+      fixed64_ = 0L;
+      sfixed32_ = 0;
+      sfixed64_ = 0L;
+      floatValue_ = 0F;
+      doubleValue_ = 0D;
+      bool_ = false;
+      string_ = "";
+      bytes_ = com.google.protobuf.ByteString.EMPTY;
+      color_ = 0;
+      sList_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      pList_ = java.util.Collections.emptyList();
+      anys_ = java.util.Collections.emptyList();
+    }
+
+    @Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    private Root(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8: {
+
+              int32_ = input.readInt32();
+              break;
+            }
+            case 16: {
+
+              int64_ = input.readInt64();
+              break;
+            }
+            case 24: {
+
+              uint32_ = input.readUInt32();
+              break;
+            }
+            case 32: {
+
+              uint64_ = input.readUInt64();
+              break;
+            }
+            case 40: {
+
+              sint32_ = input.readSInt32();
+              break;
+            }
+            case 48: {
+
+              sint64_ = input.readSInt64();
+              break;
+            }
+            case 61: {
+
+              fixed32_ = input.readFixed32();
+              break;
+            }
+            case 65: {
+
+              fixed64_ = input.readFixed64();
+              break;
+            }
+            case 77: {
+
+              sfixed32_ = input.readSFixed32();
+              break;
+            }
+            case 81: {
+
+              sfixed64_ = input.readSFixed64();
+              break;
+            }
+            case 93: {
+
+              floatValue_ = input.readFloat();
+              break;
+            }
+            case 97: {
+
+              doubleValue_ = input.readDouble();
+              break;
+            }
+            case 104: {
+
+              bool_ = input.readBool();
+              break;
+            }
+            case 114: {
+              String s = input.readStringRequireUtf8();
+
+              string_ = s;
+              break;
+            }
+            case 122: {
+
+              bytes_ = input.readBytes();
+              break;
+            }
+            case 128: {
+              int rawValue = input.readEnum();
+
+              color_ = rawValue;
+              break;
+            }
+            case 138: {
+              User.Builder subBuilder = null;
+              if (user_ != null) {
+                subBuilder = user_.toBuilder();
+              }
+              user_ = input.readMessage(User.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(user_);
+                user_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 146: {
+              if (!((mutable_bitField0_ & 0x00020000) == 0x00020000)) {
+                ssMap_ = com.google.protobuf.MapField.newMapField(
+                    SsMapDefaultEntryHolder.defaultEntry);
+                mutable_bitField0_ |= 0x00020000;
+              }
+              com.google.protobuf.MapEntry<String, String>
+                  ssMap__ = input.readMessage(
+                  SsMapDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+              ssMap_.getMutableMap().put(
+                  ssMap__.getKey(), ssMap__.getValue());
+              break;
+            }
+            case 154: {
+              if (!((mutable_bitField0_ & 0x00040000) == 0x00040000)) {
+                spMap_ = com.google.protobuf.MapField.newMapField(
+                    SpMapDefaultEntryHolder.defaultEntry);
+                mutable_bitField0_ |= 0x00040000;
+              }
+              com.google.protobuf.MapEntry<String, User>
+                  spMap__ = input.readMessage(
+                  SpMapDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+              spMap_.getMutableMap().put(
+                  spMap__.getKey(), spMap__.getValue());
+              break;
+            }
+            case 162: {
+              String s = input.readStringRequireUtf8();
+              if (!((mutable_bitField0_ & 0x00080000) == 0x00080000)) {
+                sList_ = new com.google.protobuf.LazyStringArrayList();
+                mutable_bitField0_ |= 0x00080000;
+              }
+              sList_.add(s);
+              break;
+            }
+            case 170: {
+              if (!((mutable_bitField0_ & 0x00100000) == 0x00100000)) {
+                pList_ = new java.util.ArrayList<>();
+                mutable_bitField0_ |= 0x00100000;
+              }
+              pList_.add(
+                  input.readMessage(User.parser(), extensionRegistry));
+              break;
+            }
+            case 178: {
+              com.google.protobuf.Any.Builder subBuilder = null;
+              if (any_ != null) {
+                subBuilder = any_.toBuilder();
+              }
+              any_ = input.readMessage(com.google.protobuf.Any.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(any_);
+                any_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 186: {
+              if (!((mutable_bitField0_ & 0x00400000) == 0x00400000)) {
+                anys_ = new java.util.ArrayList<>();
+                mutable_bitField0_ |= 0x00400000;
+              }
+              anys_.add(
+                  input.readMessage(com.google.protobuf.Any.parser(), extensionRegistry));
+              break;
+            }
+            case 194: {
+              Builder subBuilder = null;
+              if (typeRecursive_ != null) {
+                subBuilder = typeRecursive_.toBuilder();
+              }
+              typeRecursive_ = input.readMessage(Root.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(typeRecursive_);
+                typeRecursive_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownFieldProto3(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00080000) == 0x00080000)) {
+          sList_ = sList_.getUnmodifiableView();
+        }
+        if (((mutable_bitField0_ & 0x00100000) == 0x00100000)) {
+          pList_ = java.util.Collections.unmodifiableList(pList_);
+        }
+        if (((mutable_bitField0_ & 0x00400000) == 0x00400000)) {
+          anys_ = java.util.Collections.unmodifiableList(anys_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+    getDescriptor() {
+      return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_descriptor;
+    }
+
+    @SuppressWarnings({"rawtypes"})
+    @Override
+    protected com.google.protobuf.MapField internalGetMapField(
+        int number) {
+      switch (number) {
+        case 18:
+          return internalGetSsMap();
+        case 19:
+          return internalGetSpMap();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+
+    @Override
+    protected FieldAccessorTable
+    internalGetFieldAccessorTable() {
+      return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              Root.class, Builder.class);
+    }
+
+    private int bitField0_;
+
+    public static final int INT32_FIELD_NUMBER = 1;
+
+    private int int32_;
+
+    /**
+     * <code>int32 int32 = 1;</code>
+     */
+    public int getInt32() {
+      return int32_;
+    }
+
+    public static final int INT64_FIELD_NUMBER = 2;
+
+    private long int64_;
+
+    /**
+     * <code>int64 int64 = 2;</code>
+     */
+    public long getInt64() {
+      return int64_;
+    }
+
+    public static final int UINT32_FIELD_NUMBER = 3;
+
+    private int uint32_;
+
+    /**
+     * <code>uint32 uint32 = 3;</code>
+     */
+    public int getUint32() {
+      return uint32_;
+    }
+
+    public static final int UINT64_FIELD_NUMBER = 4;
+
+    private long uint64_;
+
+    /**
+     * <code>uint64 uint64 = 4;</code>
+     */
+    public long getUint64() {
+      return uint64_;
+    }
+
+    public static final int SINT32_FIELD_NUMBER = 5;
+
+    private int sint32_;
+
+    /**
+     * <code>sint32 sint32 = 5;</code>
+     */
+    public int getSint32() {
+      return sint32_;
+    }
+
+    public static final int SINT64_FIELD_NUMBER = 6;
+
+    private long sint64_;
+
+    /**
+     * <code>sint64 sint64 = 6;</code>
+     */
+    public long getSint64() {
+      return sint64_;
+    }
+
+    public static final int FIXED32_FIELD_NUMBER = 7;
+
+    private int fixed32_;
+
+    /**
+     * <code>fixed32 fixed32 = 7;</code>
+     */
+    public int getFixed32() {
+      return fixed32_;
+    }
+
+    public static final int FIXED64_FIELD_NUMBER = 8;
+
+    private long fixed64_;
+
+    /**
+     * <code>fixed64 fixed64 = 8;</code>
+     */
+    public long getFixed64() {
+      return fixed64_;
+    }
+
+    public static final int SFIXED32_FIELD_NUMBER = 9;
+
+    private int sfixed32_;
+
+    /**
+     * <code>sfixed32 sfixed32 = 9;</code>
+     */
+    public int getSfixed32() {
+      return sfixed32_;
+    }
+
+    public static final int SFIXED64_FIELD_NUMBER = 10;
+
+    private long sfixed64_;
+
+    /**
+     * <code>sfixed64 sfixed64 = 10;</code>
+     */
+    public long getSfixed64() {
+      return sfixed64_;
+    }
+
+    public static final int FLOATVALUE_FIELD_NUMBER = 11;
+
+    private float floatValue_;
+
+    /**
+     * <code>float floatValue = 11;</code>
+     */
+    public float getFloatValue() {
+      return floatValue_;
+    }
+
+    public static final int DOUBLEVALUE_FIELD_NUMBER = 12;
+
+    private double doubleValue_;
+
+    /**
+     * <code>double doubleValue = 12;</code>
+     */
+    public double getDoubleValue() {
+      return doubleValue_;
+    }
+
+    public static final int BOOL_FIELD_NUMBER = 13;
+
+    private boolean bool_;
+
+    /**
+     * <code>bool bool = 13;</code>
+     */
+    public boolean getBool() {
+      return bool_;
+    }
+
+    public static final int STRING_FIELD_NUMBER = 14;
+
+    private volatile Object string_;
+
+    /**
+     * <code>string string = 14;</code>
+     */
+    public String getString() {
+      Object ref = string_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        string_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * <code>string string = 14;</code>
+     */
+    public com.google.protobuf.ByteString
+    getStringBytes() {
+      Object ref = string_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (String) ref);
+        string_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int BYTES_FIELD_NUMBER = 15;
+
+    private com.google.protobuf.ByteString bytes_;
+
+    /**
+     * <code>bytes bytes = 15;</code>
+     */
+    public com.google.protobuf.ByteString getBytes() {
+      return bytes_;
+    }
+
+    public static final int COLOR_FIELD_NUMBER = 16;
+
+    private int color_;
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+     */
+    public int getColorValue() {
+      return color_;
+    }
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+     */
+    public Color getColor() {
+      @SuppressWarnings("deprecation")
+      Color result = Color.valueOf(color_);
+      return result == null ? Color.UNRECOGNIZED : result;
+    }
+
+    public static final int USER_FIELD_NUMBER = 17;
+
+    private User user_;
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+     */
+    public boolean hasUser() {
+      return user_ != null;
+    }
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+     */
+    public User getUser() {
+      return user_ == null ? User.getDefaultInstance() : user_;
+    }
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+     */
+    public UserOrBuilder getUserOrBuilder() {
+      return getUser();
+    }
+
+    public static final int SSMAP_FIELD_NUMBER = 18;
+
+    private static final class SsMapDefaultEntryHolder {
+      static final com.google.protobuf.MapEntry<
+          String, String> defaultEntry =
+          com.google.protobuf.MapEntry
+              .<String, String>newDefaultInstance(
+                  ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SsMapEntry_descriptor,
+                  com.google.protobuf.WireFormat.FieldType.STRING,
+                  "",
+                  com.google.protobuf.WireFormat.FieldType.STRING,
+                  "");
+    }
+
+    private com.google.protobuf.MapField<
+        String, String> ssMap_;
+
+    private com.google.protobuf.MapField<String, String>
+    internalGetSsMap() {
+      if (ssMap_ == null) {
+        return com.google.protobuf.MapField.emptyMapField(
+            SsMapDefaultEntryHolder.defaultEntry);
+      }
+      return ssMap_;
+    }
+
+    public int getSsMapCount() {
+      return internalGetSsMap().getMap().size();
+    }
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+
+    public boolean containsSsMap(
+        String key) {
+      if (key == null) {
+        throw new NullPointerException();
+      }
+      return internalGetSsMap().getMap().containsKey(key);
+    }
+
+    /**
+     * Use {@link #getSsMapMap()} instead.
+     */
+    @Deprecated
+    public java.util.Map<String, String> getSsMap() {
+      return getSsMapMap();
+    }
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+
+    public java.util.Map<String, String> getSsMapMap() {
+      return internalGetSsMap().getMap();
+    }
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+
+    public String getSsMapOrDefault(
+        String key,
+        String defaultValue) {
+      if (key == null) {
+        throw new NullPointerException();
+      }
+      java.util.Map<String, String> map =
+          internalGetSsMap().getMap();
+      return map.containsKey(key) ? map.get(key) : defaultValue;
+    }
+
+    /**
+     * <code>map&lt;string, string&gt; ssMap = 18;</code>
+     */
+
+    public String getSsMapOrThrow(
+        String key) {
+      if (key == null) {
+        throw new NullPointerException();
+      }
+      java.util.Map<String, String> map =
+          internalGetSsMap().getMap();
+      if (!map.containsKey(key)) {
+        throw new IllegalArgumentException();
+      }
+      return map.get(key);
+    }
+
+    public static final int SPMAP_FIELD_NUMBER = 19;
+
+    private static final class SpMapDefaultEntryHolder {
+      static final com.google.protobuf.MapEntry<
+          String, User> defaultEntry =
+          com.google.protobuf.MapEntry
+              .<String, User>newDefaultInstance(
+                  ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SpMapEntry_descriptor,
+                  com.google.protobuf.WireFormat.FieldType.STRING,
+                  "",
+                  com.google.protobuf.WireFormat.FieldType.MESSAGE,
+                  User.getDefaultInstance());
+    }
+
+    private com.google.protobuf.MapField<
+        String, User> spMap_;
+
+    private com.google.protobuf.MapField<String, User>
+    internalGetSpMap() {
+      if (spMap_ == null) {
+        return com.google.protobuf.MapField.emptyMapField(
+            SpMapDefaultEntryHolder.defaultEntry);
+      }
+      return spMap_;
+    }
+
+    public int getSpMapCount() {
+      return internalGetSpMap().getMap().size();
+    }
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+
+    public boolean containsSpMap(
+        String key) {
+      if (key == null) {
+        throw new NullPointerException();
+      }
+      return internalGetSpMap().getMap().containsKey(key);
+    }
+
+    /**
+     * Use {@link #getSpMapMap()} instead.
+     */
+    @Deprecated
+    public java.util.Map<String, User> getSpMap() {
+      return getSpMapMap();
+    }
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+
+    public java.util.Map<String, User> getSpMapMap() {
+      return internalGetSpMap().getMap();
+    }
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+
+    public User getSpMapOrDefault(
+        String key,
+        User defaultValue) {
+      if (key == null) {
+        throw new NullPointerException();
+      }
+      java.util.Map<String, User> map =
+          internalGetSpMap().getMap();
+      return map.containsKey(key) ? map.get(key) : defaultValue;
+    }
+
+    /**
+     * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+     */
+
+    public User getSpMapOrThrow(
+        String key) {
+      if (key == null) {
+        throw new NullPointerException();
+      }
+      java.util.Map<String, User> map =
+          internalGetSpMap().getMap();
+      if (!map.containsKey(key)) {
+        throw new IllegalArgumentException();
+      }
+      return map.get(key);
+    }
+
+    public static final int SLIST_FIELD_NUMBER = 20;
+
+    private com.google.protobuf.LazyStringList sList_;
+
+    /**
+     * <code>repeated string sList = 20;</code>
+     */
+    public com.google.protobuf.ProtocolStringList
+    getSListList() {
+      return sList_;
+    }
+
+    /**
+     * <code>repeated string sList = 20;</code>
+     */
+    public int getSListCount() {
+      return sList_.size();
+    }
+
+    /**
+     * <code>repeated string sList = 20;</code>
+     */
+    public String getSList(int index) {
+      return sList_.get(index);
+    }
+
+    /**
+     * <code>repeated string sList = 20;</code>
+     */
+    public com.google.protobuf.ByteString
+    getSListBytes(int index) {
+      return sList_.getByteString(index);
+    }
+
+    public static final int PLIST_FIELD_NUMBER = 21;
+
+    private java.util.List<User> pList_;
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    public java.util.List<User> getPListList() {
+      return pList_;
+    }
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    public java.util.List<? extends UserOrBuilder>
+    getPListOrBuilderList() {
+      return pList_;
+    }
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    public int getPListCount() {
+      return pList_.size();
+    }
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    public User getPList(int index) {
+      return pList_.get(index);
+    }
+
+    /**
+     * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+     */
+    public UserOrBuilder getPListOrBuilder(
+        int index) {
+      return pList_.get(index);
+    }
+
+    public static final int ANY_FIELD_NUMBER = 22;
+
+    private com.google.protobuf.Any any_;
+
+    /**
+     * <code>.google.protobuf.Any any = 22;</code>
+     */
+    public boolean hasAny() {
+      return any_ != null;
+    }
+
+    /**
+     * <code>.google.protobuf.Any any = 22;</code>
+     */
+    public com.google.protobuf.Any getAny() {
+      return any_ == null ? com.google.protobuf.Any.getDefaultInstance() : any_;
+    }
+
+    /**
+     * <code>.google.protobuf.Any any = 22;</code>
+     */
+    public com.google.protobuf.AnyOrBuilder getAnyOrBuilder() {
+      return getAny();
+    }
+
+    public static final int ANYS_FIELD_NUMBER = 23;
+
+    private java.util.List<com.google.protobuf.Any> anys_;
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    public java.util.List<com.google.protobuf.Any> getAnysList() {
+      return anys_;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    public java.util.List<? extends com.google.protobuf.AnyOrBuilder>
+    getAnysOrBuilderList() {
+      return anys_;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    public int getAnysCount() {
+      return anys_.size();
+    }
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    public com.google.protobuf.Any getAnys(int index) {
+      return anys_.get(index);
+    }
+
+    /**
+     * <code>repeated .google.protobuf.Any anys = 23;</code>
+     */
+    public com.google.protobuf.AnyOrBuilder getAnysOrBuilder(
+        int index) {
+      return anys_.get(index);
+    }
+
+    public static final int TYPERECURSIVE_FIELD_NUMBER = 24;
+
+    private Root typeRecursive_;
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+     */
+    public boolean hasTypeRecursive() {
+      return typeRecursive_ != null;
+    }
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+     */
+    public Root getTypeRecursive() {
+      return typeRecursive_ == null ? Root.getDefaultInstance() : typeRecursive_;
+    }
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+     */
+    public RootOrBuilder getTypeRecursiveOrBuilder() {
+      return getTypeRecursive();
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) {
+        return true;
+      }
+      if (isInitialized == 0) {
+        return false;
+      }
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (int32_ != 0) {
+        output.writeInt32(1, int32_);
+      }
+      if (int64_ != 0L) {
+        output.writeInt64(2, int64_);
+      }
+      if (uint32_ != 0) {
+        output.writeUInt32(3, uint32_);
+      }
+      if (uint64_ != 0L) {
+        output.writeUInt64(4, uint64_);
+      }
+      if (sint32_ != 0) {
+        output.writeSInt32(5, sint32_);
+      }
+      if (sint64_ != 0L) {
+        output.writeSInt64(6, sint64_);
+      }
+      if (fixed32_ != 0) {
+        output.writeFixed32(7, fixed32_);
+      }
+      if (fixed64_ != 0L) {
+        output.writeFixed64(8, fixed64_);
+      }
+      if (sfixed32_ != 0) {
+        output.writeSFixed32(9, sfixed32_);
+      }
+      if (sfixed64_ != 0L) {
+        output.writeSFixed64(10, sfixed64_);
+      }
+      if (floatValue_ != 0F) {
+        output.writeFloat(11, floatValue_);
+      }
+      if (doubleValue_ != 0D) {
+        output.writeDouble(12, doubleValue_);
+      }
+      if (bool_ != false) {
+        output.writeBool(13, bool_);
+      }
+      if (!getStringBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 14, string_);
+      }
+      if (!bytes_.isEmpty()) {
+        output.writeBytes(15, bytes_);
+      }
+      if (color_ != Color.RED.getNumber()) {
+        output.writeEnum(16, color_);
+      }
+      if (user_ != null) {
+        output.writeMessage(17, getUser());
+      }
+      com.google.protobuf.GeneratedMessageV3
+          .serializeStringMapTo(
+              output,
+              internalGetSsMap(),
+              SsMapDefaultEntryHolder.defaultEntry,
+              18);
+      com.google.protobuf.GeneratedMessageV3
+          .serializeStringMapTo(
+              output,
+              internalGetSpMap(),
+              SpMapDefaultEntryHolder.defaultEntry,
+              19);
+      for (int i = 0; i < sList_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 20, sList_.getRaw(i));
+      }
+      for (int i = 0; i < pList_.size(); i++) {
+        output.writeMessage(21, pList_.get(i));
+      }
+      if (any_ != null) {
+        output.writeMessage(22, getAny());
+      }
+      for (int i = 0; i < anys_.size(); i++) {
+        output.writeMessage(23, anys_.get(i));
+      }
+      if (typeRecursive_ != null) {
+        output.writeMessage(24, getTypeRecursive());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) {
+        return size;
+      }
+
+      size = 0;
+      if (int32_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(1, int32_);
+      }
+      if (int64_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeInt64Size(2, int64_);
+      }
+      if (uint32_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeUInt32Size(3, uint32_);
+      }
+      if (uint64_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeUInt64Size(4, uint64_);
+      }
+      if (sint32_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeSInt32Size(5, sint32_);
+      }
+      if (sint64_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeSInt64Size(6, sint64_);
+      }
+      if (fixed32_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeFixed32Size(7, fixed32_);
+      }
+      if (fixed64_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeFixed64Size(8, fixed64_);
+      }
+      if (sfixed32_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeSFixed32Size(9, sfixed32_);
+      }
+      if (sfixed64_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeSFixed64Size(10, sfixed64_);
+      }
+      if (floatValue_ != 0F) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeFloatSize(11, floatValue_);
+      }
+      if (doubleValue_ != 0D) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(12, doubleValue_);
+      }
+      if (bool_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeBoolSize(13, bool_);
+      }
+      if (!getStringBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, string_);
+      }
+      if (!bytes_.isEmpty()) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(15, bytes_);
+      }
+      if (color_ != Color.RED.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeEnumSize(16, color_);
+      }
+      if (user_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(17, getUser());
+      }
+      for (java.util.Map.Entry<String, String> entry
+          : internalGetSsMap().getMap().entrySet()) {
+        com.google.protobuf.MapEntry<String, String>
+            ssMap__ = SsMapDefaultEntryHolder.defaultEntry.newBuilderForType()
+            .setKey(entry.getKey())
+            .setValue(entry.getValue())
+            .build();
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(18, ssMap__);
+      }
+      for (java.util.Map.Entry<String, User> entry
+          : internalGetSpMap().getMap().entrySet()) {
+        com.google.protobuf.MapEntry<String, User>
+            spMap__ = SpMapDefaultEntryHolder.defaultEntry.newBuilderForType()
+            .setKey(entry.getKey())
+            .setValue(entry.getValue())
+            .build();
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(19, spMap__);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < sList_.size(); i++) {
+          dataSize += computeStringSizeNoTag(sList_.getRaw(i));
+        }
+        size += dataSize;
+        size += 2 * getSListList().size();
+      }
+      for (int i = 0; i < pList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(21, pList_.get(i));
+      }
+      if (any_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(22, getAny());
+      }
+      for (int i = 0; i < anys_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(23, anys_.get(i));
+      }
+      if (typeRecursive_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(24, getTypeRecursive());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof Root)) {
+        return super.equals(obj);
+      }
+      Root other = (Root) obj;
+
+      boolean result = true;
+      result = result && (getInt32()
+          == other.getInt32());
+      result = result && (getInt64()
+          == other.getInt64());
+      result = result && (getUint32()
+          == other.getUint32());
+      result = result && (getUint64()
+          == other.getUint64());
+      result = result && (getSint32()
+          == other.getSint32());
+      result = result && (getSint64()
+          == other.getSint64());
+      result = result && (getFixed32()
+          == other.getFixed32());
+      result = result && (getFixed64()
+          == other.getFixed64());
+      result = result && (getSfixed32()
+          == other.getSfixed32());
+      result = result && (getSfixed64()
+          == other.getSfixed64());
+      result = result && (
+          Float.floatToIntBits(getFloatValue())
+              == Float.floatToIntBits(
+              other.getFloatValue()));
+      result = result && (
+          Double.doubleToLongBits(getDoubleValue())
+              == Double.doubleToLongBits(
+              other.getDoubleValue()));
+      result = result && (getBool()
+          == other.getBool());
+      result = result && getString()
+          .equals(other.getString());
+      result = result && getBytes()
+          .equals(other.getBytes());
+      result = result && color_ == other.color_;
+      result = result && (hasUser() == other.hasUser());
+      if (hasUser()) {
+        result = result && getUser()
+            .equals(other.getUser());
+      }
+      result = result && internalGetSsMap().equals(
+          other.internalGetSsMap());
+      result = result && internalGetSpMap().equals(
+          other.internalGetSpMap());
+      result = result && getSListList()
+          .equals(other.getSListList());
+      result = result && getPListList()
+          .equals(other.getPListList());
+      result = result && (hasAny() == other.hasAny());
+      if (hasAny()) {
+        result = result && getAny()
+            .equals(other.getAny());
+      }
+      result = result && getAnysList()
+          .equals(other.getAnysList());
+      result = result && (hasTypeRecursive() == other.hasTypeRecursive());
+      if (hasTypeRecursive()) {
+        result = result && getTypeRecursive()
+            .equals(other.getTypeRecursive());
+      }
+      result = result && unknownFields.equals(other.unknownFields);
+      return result;
+    }
+
+    @Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + INT32_FIELD_NUMBER;
+      hash = (53 * hash) + getInt32();
+      hash = (37 * hash) + INT64_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+          getInt64());
+      hash = (37 * hash) + UINT32_FIELD_NUMBER;
+      hash = (53 * hash) + getUint32();
+      hash = (37 * hash) + UINT64_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+          getUint64());
+      hash = (37 * hash) + SINT32_FIELD_NUMBER;
+      hash = (53 * hash) + getSint32();
+      hash = (37 * hash) + SINT64_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+          getSint64());
+      hash = (37 * hash) + FIXED32_FIELD_NUMBER;
+      hash = (53 * hash) + getFixed32();
+      hash = (37 * hash) + FIXED64_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+          getFixed64());
+      hash = (37 * hash) + SFIXED32_FIELD_NUMBER;
+      hash = (53 * hash) + getSfixed32();
+      hash = (37 * hash) + SFIXED64_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+          getSfixed64());
+      hash = (37 * hash) + FLOATVALUE_FIELD_NUMBER;
+      hash = (53 * hash) + Float.floatToIntBits(
+          getFloatValue());
+      hash = (37 * hash) + DOUBLEVALUE_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+          Double.doubleToLongBits(getDoubleValue()));
+      hash = (37 * hash) + BOOL_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getBool());
+      hash = (37 * hash) + STRING_FIELD_NUMBER;
+      hash = (53 * hash) + getString().hashCode();
+      hash = (37 * hash) + BYTES_FIELD_NUMBER;
+      hash = (53 * hash) + getBytes().hashCode();
+      hash = (37 * hash) + COLOR_FIELD_NUMBER;
+      hash = (53 * hash) + color_;
+      if (hasUser()) {
+        hash = (37 * hash) + USER_FIELD_NUMBER;
+        hash = (53 * hash) + getUser().hashCode();
+      }
+      if (!internalGetSsMap().getMap().isEmpty()) {
+        hash = (37 * hash) + SSMAP_FIELD_NUMBER;
+        hash = (53 * hash) + internalGetSsMap().hashCode();
+      }
+      if (!internalGetSpMap().getMap().isEmpty()) {
+        hash = (37 * hash) + SPMAP_FIELD_NUMBER;
+        hash = (53 * hash) + internalGetSpMap().hashCode();
+      }
+      if (getSListCount() > 0) {
+        hash = (37 * hash) + SLIST_FIELD_NUMBER;
+        hash = (53 * hash) + getSListList().hashCode();
+      }
+      if (getPListCount() > 0) {
+        hash = (37 * hash) + PLIST_FIELD_NUMBER;
+        hash = (53 * hash) + getPListList().hashCode();
+      }
+      if (hasAny()) {
+        hash = (37 * hash) + ANY_FIELD_NUMBER;
+        hash = (53 * hash) + getAny().hashCode();
+      }
+      if (getAnysCount() > 0) {
+        hash = (37 * hash) + ANYS_FIELD_NUMBER;
+        hash = (53 * hash) + getAnysList().hashCode();
+      }
+      if (hasTypeRecursive()) {
+        hash = (37 * hash) + TYPERECURSIVE_FIELD_NUMBER;
+        hash = (53 * hash) + getTypeRecursive().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static Root parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static Root parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Root parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static Root parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Root parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static Root parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static Root parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static Root parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static Root parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static Root parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static Root parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static Root parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(Root prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @Override
+    protected Builder newBuilderForType(
+        BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code org.apache.servicecomb.foundation.protobuf.internal.model.Root}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:org.apache.servicecomb.foundation.protobuf.internal.model.Root)
+        RootOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+        return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_descriptor;
+      }
+
+      @SuppressWarnings({"rawtypes"})
+      protected com.google.protobuf.MapField internalGetMapField(
+          int number) {
+        switch (number) {
+          case 18:
+            return internalGetSsMap();
+          case 19:
+            return internalGetSpMap();
+          default:
+            throw new RuntimeException(
+                "Invalid map field number: " + number);
+        }
+      }
+
+      @SuppressWarnings({"rawtypes"})
+      protected com.google.protobuf.MapField internalGetMutableMapField(
+          int number) {
+        switch (number) {
+          case 18:
+            return internalGetMutableSsMap();
+          case 19:
+            return internalGetMutableSpMap();
+          default:
+            throw new RuntimeException(
+                "Invalid map field number: " + number);
+        }
+      }
+
+      @Override
+      protected FieldAccessorTable
+      internalGetFieldAccessorTable() {
+        return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                Root.class, Builder.class);
+      }
+
+      // Construct using org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot.Root.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+            .alwaysUseFieldBuilders) {
+          getPListFieldBuilder();
+          getAnysFieldBuilder();
+        }
+      }
+
+      @Override
+      public Builder clear() {
+        super.clear();
+        int32_ = 0;
+
+        int64_ = 0L;
+
+        uint32_ = 0;
+
+        uint64_ = 0L;
+
+        sint32_ = 0;
+
+        sint64_ = 0L;
+
+        fixed32_ = 0;
+
+        fixed64_ = 0L;
+
+        sfixed32_ = 0;
+
+        sfixed64_ = 0L;
+
+        floatValue_ = 0F;
+
+        doubleValue_ = 0D;
+
+        bool_ = false;
+
+        string_ = "";
+
+        bytes_ = com.google.protobuf.ByteString.EMPTY;
+
+        color_ = 0;
+
+        if (userBuilder_ == null) {
+          user_ = null;
+        } else {
+          user_ = null;
+          userBuilder_ = null;
+        }
+        internalGetMutableSsMap().clear();
+        internalGetMutableSpMap().clear();
+        sList_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00080000);
+        if (pListBuilder_ == null) {
+          pList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00100000);
+        } else {
+          pListBuilder_.clear();
+        }
+        if (anyBuilder_ == null) {
+          any_ = null;
+        } else {
+          any_ = null;
+          anyBuilder_ = null;
+        }
+        if (anysBuilder_ == null) {
+          anys_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00400000);
+        } else {
+          anysBuilder_.clear();
+        }
+        if (typeRecursiveBuilder_ == null) {
+          typeRecursive_ = null;
+        } else {
+          typeRecursive_ = null;
+          typeRecursiveBuilder_ = null;
+        }
+        return this;
+      }
+
+      @Override
+      public com.google.protobuf.Descriptors.Descriptor
+      getDescriptorForType() {
+        return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_descriptor;
+      }
+
+      @Override
+      public Root getDefaultInstanceForType() {
+        return Root.getDefaultInstance();
+      }
+
+      @Override
+      public Root build() {
+        Root result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @Override
+      public Root buildPartial() {
+        Root result = new Root(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        result.int32_ = int32_;
+        result.int64_ = int64_;
+        result.uint32_ = uint32_;
+        result.uint64_ = uint64_;
+        result.sint32_ = sint32_;
+        result.sint64_ = sint64_;
+        result.fixed32_ = fixed32_;
+        result.fixed64_ = fixed64_;
+        result.sfixed32_ = sfixed32_;
+        result.sfixed64_ = sfixed64_;
+        result.floatValue_ = floatValue_;
+        result.doubleValue_ = doubleValue_;
+        result.bool_ = bool_;
+        result.string_ = string_;
+        result.bytes_ = bytes_;
+        result.color_ = color_;
+        if (userBuilder_ == null) {
+          result.user_ = user_;
+        } else {
+          result.user_ = userBuilder_.build();
+        }
+        result.ssMap_ = internalGetSsMap();
+        result.ssMap_.makeImmutable();
+        result.spMap_ = internalGetSpMap();
+        result.spMap_.makeImmutable();
+        if (((bitField0_ & 0x00080000) == 0x00080000)) {
+          sList_ = sList_.getUnmodifiableView();
+          bitField0_ = (bitField0_ & ~0x00080000);
+        }
+        result.sList_ = sList_;
+        if (pListBuilder_ == null) {
+          if (((bitField0_ & 0x00100000) == 0x00100000)) {
+            pList_ = java.util.Collections.unmodifiableList(pList_);
+            bitField0_ = (bitField0_ & ~0x00100000);
+          }
+          result.pList_ = pList_;
+        } else {
+          result.pList_ = pListBuilder_.build();
+        }
+        if (anyBuilder_ == null) {
+          result.any_ = any_;
+        } else {
+          result.any_ = anyBuilder_.build();
+        }
+        if (anysBuilder_ == null) {
+          if (((bitField0_ & 0x00400000) == 0x00400000)) {
+            anys_ = java.util.Collections.unmodifiableList(anys_);
+            bitField0_ = (bitField0_ & ~0x00400000);
+          }
+          result.anys_ = anys_;
+        } else {
+          result.anys_ = anysBuilder_.build();
+        }
+        if (typeRecursiveBuilder_ == null) {
+          result.typeRecursive_ = typeRecursive_;
+        } else {
+          result.typeRecursive_ = typeRecursiveBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      @Override
+      public Builder clone() {
+        return (Builder) super.clone();
+      }
+
+      @Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          Object value) {
+        return (Builder) super.setField(field, value);
+      }
+
+      @Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return (Builder) super.clearField(field);
+      }
+
+      @Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return (Builder) super.clearOneof(oneof);
+      }
+
+      @Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, Object value) {
+        return (Builder) super.setRepeatedField(field, index, value);
+      }
+
+      @Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          Object value) {
+        return (Builder) super.addRepeatedField(field, value);
+      }
+
+      @Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof Root) {
+          return mergeFrom((Root) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(Root other) {
+        if (other == Root.getDefaultInstance()) {
+          return this;
+        }
+        if (other.getInt32() != 0) {
+          setInt32(other.getInt32());
+        }
+        if (other.getInt64() != 0L) {
+          setInt64(other.getInt64());
+        }
+        if (other.getUint32() != 0) {
+          setUint32(other.getUint32());
+        }
+        if (other.getUint64() != 0L) {
+          setUint64(other.getUint64());
+        }
+        if (other.getSint32() != 0) {
+          setSint32(other.getSint32());
+        }
+        if (other.getSint64() != 0L) {
+          setSint64(other.getSint64());
+        }
+        if (other.getFixed32() != 0) {
+          setFixed32(other.getFixed32());
+        }
+        if (other.getFixed64() != 0L) {
+          setFixed64(other.getFixed64());
+        }
+        if (other.getSfixed32() != 0) {
+          setSfixed32(other.getSfixed32());
+        }
+        if (other.getSfixed64() != 0L) {
+          setSfixed64(other.getSfixed64());
+        }
+        if (other.getFloatValue() != 0F) {
+          setFloatValue(other.getFloatValue());
+        }
+        if (other.getDoubleValue() != 0D) {
+          setDoubleValue(other.getDoubleValue());
+        }
+        if (other.getBool() != false) {
+          setBool(other.getBool());
+        }
+        if (!other.getString().isEmpty()) {
+          string_ = other.string_;
+          onChanged();
+        }
+        if (other.getBytes() != com.google.protobuf.ByteString.EMPTY) {
+          setBytes(other.getBytes());
+        }
+        if (other.color_ != 0) {
+          setColorValue(other.getColorValue());
+        }
+        if (other.hasUser()) {
+          mergeUser(other.getUser());
+        }
+        internalGetMutableSsMap().mergeFrom(
+            other.internalGetSsMap());
+        internalGetMutableSpMap().mergeFrom(
+            other.internalGetSpMap());
+        if (!other.sList_.isEmpty()) {
+          if (sList_.isEmpty()) {
+            sList_ = other.sList_;
+            bitField0_ = (bitField0_ & ~0x00080000);
+          } else {
+            ensureSListIsMutable();
+            sList_.addAll(other.sList_);
+          }
+          onChanged();
+        }
+        if (pListBuilder_ == null) {
+          if (!other.pList_.isEmpty()) {
+            if (pList_.isEmpty()) {
+              pList_ = other.pList_;
+              bitField0_ = (bitField0_ & ~0x00100000);
+            } else {
+              ensurePListIsMutable();
+              pList_.addAll(other.pList_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.pList_.isEmpty()) {
+            if (pListBuilder_.isEmpty()) {
+              pListBuilder_.dispose();
+              pListBuilder_ = null;
+              pList_ = other.pList_;
+              bitField0_ = (bitField0_ & ~0x00100000);
+              pListBuilder_ =
+                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                      getPListFieldBuilder() : null;
+            } else {
+              pListBuilder_.addAllMessages(other.pList_);
+            }
+          }
+        }
+        if (other.hasAny()) {
+          mergeAny(other.getAny());
+        }
+        if (anysBuilder_ == null) {
+          if (!other.anys_.isEmpty()) {
+            if (anys_.isEmpty()) {
+              anys_ = other.anys_;
+              bitField0_ = (bitField0_ & ~0x00400000);
+            } else {
+              ensureAnysIsMutable();
+              anys_.addAll(other.anys_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.anys_.isEmpty()) {
+            if (anysBuilder_.isEmpty()) {
+              anysBuilder_.dispose();
+              anysBuilder_ = null;
+              anys_ = other.anys_;
+              bitField0_ = (bitField0_ & ~0x00400000);
+              anysBuilder_ =
+                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                      getAnysFieldBuilder() : null;
+            } else {
+              anysBuilder_.addAllMessages(other.anys_);
+            }
+          }
+        }
+        if (other.hasTypeRecursive()) {
+          mergeTypeRecursive(other.getTypeRecursive());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Root parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (Root) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private int bitField0_;
+
+      private int int32_;
+
+      /**
+       * <code>int32 int32 = 1;</code>
+       */
+      public int getInt32() {
+        return int32_;
+      }
+
+      /**
+       * <code>int32 int32 = 1;</code>
+       */
+      public Builder setInt32(int value) {
+
+        int32_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>int32 int32 = 1;</code>
+       */
+      public Builder clearInt32() {
+
+        int32_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private long int64_;
+
+      /**
+       * <code>int64 int64 = 2;</code>
+       */
+      public long getInt64() {
+        return int64_;
+      }
+
+      /**
+       * <code>int64 int64 = 2;</code>
+       */
+      public Builder setInt64(long value) {
+
+        int64_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>int64 int64 = 2;</code>
+       */
+      public Builder clearInt64() {
+
+        int64_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private int uint32_;
+
+      /**
+       * <code>uint32 uint32 = 3;</code>
+       */
+      public int getUint32() {
+        return uint32_;
+      }
+
+      /**
+       * <code>uint32 uint32 = 3;</code>
+       */
+      public Builder setUint32(int value) {
+
+        uint32_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>uint32 uint32 = 3;</code>
+       */
+      public Builder clearUint32() {
+
+        uint32_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private long uint64_;
+
+      /**
+       * <code>uint64 uint64 = 4;</code>
+       */
+      public long getUint64() {
+        return uint64_;
+      }
+
+      /**
+       * <code>uint64 uint64 = 4;</code>
+       */
+      public Builder setUint64(long value) {
+
+        uint64_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>uint64 uint64 = 4;</code>
+       */
+      public Builder clearUint64() {
+
+        uint64_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private int sint32_;
+
+      /**
+       * <code>sint32 sint32 = 5;</code>
+       */
+      public int getSint32() {
+        return sint32_;
+      }
+
+      /**
+       * <code>sint32 sint32 = 5;</code>
+       */
+      public Builder setSint32(int value) {
+
+        sint32_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>sint32 sint32 = 5;</code>
+       */
+      public Builder clearSint32() {
+
+        sint32_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private long sint64_;
+
+      /**
+       * <code>sint64 sint64 = 6;</code>
+       */
+      public long getSint64() {
+        return sint64_;
+      }
+
+      /**
+       * <code>sint64 sint64 = 6;</code>
+       */
+      public Builder setSint64(long value) {
+
+        sint64_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>sint64 sint64 = 6;</code>
+       */
+      public Builder clearSint64() {
+
+        sint64_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private int fixed32_;
+
+      /**
+       * <code>fixed32 fixed32 = 7;</code>
+       */
+      public int getFixed32() {
+        return fixed32_;
+      }
+
+      /**
+       * <code>fixed32 fixed32 = 7;</code>
+       */
+      public Builder setFixed32(int value) {
+
+        fixed32_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>fixed32 fixed32 = 7;</code>
+       */
+      public Builder clearFixed32() {
+
+        fixed32_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private long fixed64_;
+
+      /**
+       * <code>fixed64 fixed64 = 8;</code>
+       */
+      public long getFixed64() {
+        return fixed64_;
+      }
+
+      /**
+       * <code>fixed64 fixed64 = 8;</code>
+       */
+      public Builder setFixed64(long value) {
+
+        fixed64_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>fixed64 fixed64 = 8;</code>
+       */
+      public Builder clearFixed64() {
+
+        fixed64_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private int sfixed32_;
+
+      /**
+       * <code>sfixed32 sfixed32 = 9;</code>
+       */
+      public int getSfixed32() {
+        return sfixed32_;
+      }
+
+      /**
+       * <code>sfixed32 sfixed32 = 9;</code>
+       */
+      public Builder setSfixed32(int value) {
+
+        sfixed32_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>sfixed32 sfixed32 = 9;</code>
+       */
+      public Builder clearSfixed32() {
+
+        sfixed32_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private long sfixed64_;
+
+      /**
+       * <code>sfixed64 sfixed64 = 10;</code>
+       */
+      public long getSfixed64() {
+        return sfixed64_;
+      }
+
+      /**
+       * <code>sfixed64 sfixed64 = 10;</code>
+       */
+      public Builder setSfixed64(long value) {
+
+        sfixed64_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>sfixed64 sfixed64 = 10;</code>
+       */
+      public Builder clearSfixed64() {
+
+        sfixed64_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private float floatValue_;
+
+      /**
+       * <code>float floatValue = 11;</code>
+       */
+      public float getFloatValue() {
+        return floatValue_;
+      }
+
+      /**
+       * <code>float floatValue = 11;</code>
+       */
+      public Builder setFloatValue(float value) {
+
+        floatValue_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>float floatValue = 11;</code>
+       */
+      public Builder clearFloatValue() {
+
+        floatValue_ = 0F;
+        onChanged();
+        return this;
+      }
+
+      private double doubleValue_;
+
+      /**
+       * <code>double doubleValue = 12;</code>
+       */
+      public double getDoubleValue() {
+        return doubleValue_;
+      }
+
+      /**
+       * <code>double doubleValue = 12;</code>
+       */
+      public Builder setDoubleValue(double value) {
+
+        doubleValue_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>double doubleValue = 12;</code>
+       */
+      public Builder clearDoubleValue() {
+
+        doubleValue_ = 0D;
+        onChanged();
+        return this;
+      }
+
+      private boolean bool_;
+
+      /**
+       * <code>bool bool = 13;</code>
+       */
+      public boolean getBool() {
+        return bool_;
+      }
+
+      /**
+       * <code>bool bool = 13;</code>
+       */
+      public Builder setBool(boolean value) {
+
+        bool_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>bool bool = 13;</code>
+       */
+      public Builder clearBool() {
+
+        bool_ = false;
+        onChanged();
+        return this;
+      }
+
+      private Object string_ = "";
+
+      /**
+       * <code>string string = 14;</code>
+       */
+      public String getString() {
+        Object ref = string_;
+        if (!(ref instanceof String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          string_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+
+      /**
+       * <code>string string = 14;</code>
+       */
+      public com.google.protobuf.ByteString
+      getStringBytes() {
+        Object ref = string_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (String) ref);
+          string_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * <code>string string = 14;</code>
+       */
+      public Builder setString(
+          String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        string_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>string string = 14;</code>
+       */
+      public Builder clearString() {
+
+        string_ = getDefaultInstance().getString();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>string string = 14;</code>
+       */
+      public Builder setStringBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        string_ = value;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.ByteString bytes_ = com.google.protobuf.ByteString.EMPTY;
+
+      /**
+       * <code>bytes bytes = 15;</code>
+       */
+      public com.google.protobuf.ByteString getBytes() {
+        return bytes_;
+      }
+
+      /**
+       * <code>bytes bytes = 15;</code>
+       */
+      public Builder setBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        bytes_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>bytes bytes = 15;</code>
+       */
+      public Builder clearBytes() {
+
+        bytes_ = getDefaultInstance().getBytes();
+        onChanged();
+        return this;
+      }
+
+      private int color_ = 0;
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+       */
+      public int getColorValue() {
+        return color_;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+       */
+      public Builder setColorValue(int value) {
+        color_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+       */
+      public Color getColor() {
+        @SuppressWarnings("deprecation")
+        Color result = Color.valueOf(color_);
+        return result == null ? Color.UNRECOGNIZED : result;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+       */
+      public Builder setColor(Color value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        color_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Color color = 16;</code>
+       */
+      public Builder clearColor() {
+
+        color_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private User user_ = null;
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          User, User.Builder, UserOrBuilder> userBuilder_;
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      public boolean hasUser() {
+        return userBuilder_ != null || user_ != null;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      public User getUser() {
+        if (userBuilder_ == null) {
+          return user_ == null ? User.getDefaultInstance() : user_;
+        } else {
+          return userBuilder_.getMessage();
+        }
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      public Builder setUser(User value) {
+        if (userBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          user_ = value;
+          onChanged();
+        } else {
+          userBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      public Builder setUser(
+          User.Builder builderForValue) {
+        if (userBuilder_ == null) {
+          user_ = builderForValue.build();
+          onChanged();
+        } else {
+          userBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      public Builder mergeUser(User value) {
+        if (userBuilder_ == null) {
+          if (user_ != null) {
+            user_ =
+                User.newBuilder(user_).mergeFrom(value).buildPartial();
+          } else {
+            user_ = value;
+          }
+          onChanged();
+        } else {
+          userBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      public Builder clearUser() {
+        if (userBuilder_ == null) {
+          user_ = null;
+          onChanged();
+        } else {
+          user_ = null;
+          userBuilder_ = null;
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      public User.Builder getUserBuilder() {
+
+        onChanged();
+        return getUserFieldBuilder().getBuilder();
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      public UserOrBuilder getUserOrBuilder() {
+        if (userBuilder_ != null) {
+          return userBuilder_.getMessageOrBuilder();
+        } else {
+          return user_ == null ?
+              User.getDefaultInstance() : user_;
+        }
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.User user = 17;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          User, User.Builder, UserOrBuilder>
+      getUserFieldBuilder() {
+        if (userBuilder_ == null) {
+          userBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<>(
+              getUser(),
+              getParentForChildren(),
+              isClean());
+          user_ = null;
+        }
+        return userBuilder_;
+      }
+
+      private com.google.protobuf.MapField<
+          String, String> ssMap_;
+
+      private com.google.protobuf.MapField<String, String>
+      internalGetSsMap() {
+        if (ssMap_ == null) {
+          return com.google.protobuf.MapField.emptyMapField(
+              SsMapDefaultEntryHolder.defaultEntry);
+        }
+        return ssMap_;
+      }
+
+      private com.google.protobuf.MapField<String, String>
+      internalGetMutableSsMap() {
+        onChanged();
+        if (ssMap_ == null) {
+          ssMap_ = com.google.protobuf.MapField.newMapField(
+              SsMapDefaultEntryHolder.defaultEntry);
+        }
+        if (!ssMap_.isMutable()) {
+          ssMap_ = ssMap_.copy();
+        }
+        return ssMap_;
+      }
+
+      public int getSsMapCount() {
+        return internalGetSsMap().getMap().size();
+      }
+
+      /**
+       * <code>map&lt;string, string&gt; ssMap = 18;</code>
+       */
+
+      public boolean containsSsMap(
+          String key) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        return internalGetSsMap().getMap().containsKey(key);
+      }
+
+      /**
+       * Use {@link #getSsMapMap()} instead.
+       */
+      @Deprecated
+      public java.util.Map<String, String> getSsMap() {
+        return getSsMapMap();
+      }
+
+      /**
+       * <code>map&lt;string, string&gt; ssMap = 18;</code>
+       */
+
+      public java.util.Map<String, String> getSsMapMap() {
+        return internalGetSsMap().getMap();
+      }
+
+      /**
+       * <code>map&lt;string, string&gt; ssMap = 18;</code>
+       */
+
+      public String getSsMapOrDefault(
+          String key,
+          String defaultValue) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        java.util.Map<String, String> map =
+            internalGetSsMap().getMap();
+        return map.containsKey(key) ? map.get(key) : defaultValue;
+      }
+
+      /**
+       * <code>map&lt;string, string&gt; ssMap = 18;</code>
+       */
+
+      public String getSsMapOrThrow(
+          String key) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        java.util.Map<String, String> map =
+            internalGetSsMap().getMap();
+        if (!map.containsKey(key)) {
+          throw new IllegalArgumentException();
+        }
+        return map.get(key);
+      }
+
+      public Builder clearSsMap() {
+        internalGetMutableSsMap().getMutableMap()
+            .clear();
+        return this;
+      }
+
+      /**
+       * <code>map&lt;string, string&gt; ssMap = 18;</code>
+       */
+
+      public Builder removeSsMap(
+          String key) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        internalGetMutableSsMap().getMutableMap()
+            .remove(key);
+        return this;
+      }
+
+      /**
+       * Use alternate mutation accessors instead.
+       */
+      @Deprecated
+      public java.util.Map<String, String>
+      getMutableSsMap() {
+        return internalGetMutableSsMap().getMutableMap();
+      }
+
+      /**
+       * <code>map&lt;string, string&gt; ssMap = 18;</code>
+       */
+      public Builder putSsMap(
+          String key,
+          String value) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        internalGetMutableSsMap().getMutableMap()
+            .put(key, value);
+        return this;
+      }
+
+      /**
+       * <code>map&lt;string, string&gt; ssMap = 18;</code>
+       */
+
+      public Builder putAllSsMap(
+          java.util.Map<String, String> values) {
+        internalGetMutableSsMap().getMutableMap()
+            .putAll(values);
+        return this;
+      }
+
+      private com.google.protobuf.MapField<
+          String, User> spMap_;
+
+      private com.google.protobuf.MapField<String, User>
+      internalGetSpMap() {
+        if (spMap_ == null) {
+          return com.google.protobuf.MapField.emptyMapField(
+              SpMapDefaultEntryHolder.defaultEntry);
+        }
+        return spMap_;
+      }
+
+      private com.google.protobuf.MapField<String, User>
+      internalGetMutableSpMap() {
+        onChanged();
+        if (spMap_ == null) {
+          spMap_ = com.google.protobuf.MapField.newMapField(
+              SpMapDefaultEntryHolder.defaultEntry);
+        }
+        if (!spMap_.isMutable()) {
+          spMap_ = spMap_.copy();
+        }
+        return spMap_;
+      }
+
+      public int getSpMapCount() {
+        return internalGetSpMap().getMap().size();
+      }
+
+      /**
+       * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+       */
+
+      public boolean containsSpMap(
+          String key) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        return internalGetSpMap().getMap().containsKey(key);
+      }
+
+      /**
+       * Use {@link #getSpMapMap()} instead.
+       */
+      @Deprecated
+      public java.util.Map<String, User> getSpMap() {
+        return getSpMapMap();
+      }
+
+      /**
+       * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+       */
+
+      public java.util.Map<String, User> getSpMapMap() {
+        return internalGetSpMap().getMap();
+      }
+
+      /**
+       * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+       */
+
+      public User getSpMapOrDefault(
+          String key,
+          User defaultValue) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        java.util.Map<String, User> map =
+            internalGetSpMap().getMap();
+        return map.containsKey(key) ? map.get(key) : defaultValue;
+      }
+
+      /**
+       * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+       */
+
+      public User getSpMapOrThrow(
+          String key) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        java.util.Map<String, User> map =
+            internalGetSpMap().getMap();
+        if (!map.containsKey(key)) {
+          throw new IllegalArgumentException();
+        }
+        return map.get(key);
+      }
+
+      public Builder clearSpMap() {
+        internalGetMutableSpMap().getMutableMap()
+            .clear();
+        return this;
+      }
+
+      /**
+       * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+       */
+
+      public Builder removeSpMap(
+          String key) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        internalGetMutableSpMap().getMutableMap()
+            .remove(key);
+        return this;
+      }
+
+      /**
+       * Use alternate mutation accessors instead.
+       */
+      @Deprecated
+      public java.util.Map<String, User>
+      getMutableSpMap() {
+        return internalGetMutableSpMap().getMutableMap();
+      }
+
+      /**
+       * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+       */
+      public Builder putSpMap(
+          String key,
+          User value) {
+        if (key == null) {
+          throw new NullPointerException();
+        }
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        internalGetMutableSpMap().getMutableMap()
+            .put(key, value);
+        return this;
+      }
+
+      /**
+       * <code>map&lt;string, .org.apache.servicecomb.foundation.protobuf.internal.model.User&gt; spMap = 19;</code>
+       */
+
+      public Builder putAllSpMap(
+          java.util.Map<String, User> values) {
+        internalGetMutableSpMap().getMutableMap()
+            .putAll(values);
+        return this;
+      }
+
+      private com.google.protobuf.LazyStringList sList_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+
+      private void ensureSListIsMutable() {
+        if (!((bitField0_ & 0x00080000) == 0x00080000)) {
+          sList_ = new com.google.protobuf.LazyStringArrayList(sList_);
+          bitField0_ |= 0x00080000;
+        }
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public com.google.protobuf.ProtocolStringList
+      getSListList() {
+        return sList_.getUnmodifiableView();
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public int getSListCount() {
+        return sList_.size();
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public String getSList(int index) {
+        return sList_.get(index);
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public com.google.protobuf.ByteString
+      getSListBytes(int index) {
+        return sList_.getByteString(index);
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public Builder setSList(
+          int index, String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureSListIsMutable();
+        sList_.set(index, value);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public Builder addSList(
+          String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureSListIsMutable();
+        sList_.add(value);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public Builder addAllSList(
+          Iterable<String> values) {
+        ensureSListIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, sList_);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public Builder clearSList() {
+        sList_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00080000);
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>repeated string sList = 20;</code>
+       */
+      public Builder addSListBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        ensureSListIsMutable();
+        sList_.add(value);
+        onChanged();
+        return this;
+      }
+
+      private java.util.List<User> pList_ =
+          java.util.Collections.emptyList();
+
+      private void ensurePListIsMutable() {
+        if (!((bitField0_ & 0x00100000) == 0x00100000)) {
+          pList_ = new java.util.ArrayList<>(pList_);
+          bitField0_ |= 0x00100000;
+        }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          User, User.Builder, UserOrBuilder> pListBuilder_;
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public java.util.List<User> getPListList() {
+        if (pListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(pList_);
+        } else {
+          return pListBuilder_.getMessageList();
+        }
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public int getPListCount() {
+        if (pListBuilder_ == null) {
+          return pList_.size();
+        } else {
+          return pListBuilder_.getCount();
+        }
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public User getPList(int index) {
+        if (pListBuilder_ == null) {
+          return pList_.get(index);
+        } else {
+          return pListBuilder_.getMessage(index);
+        }
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder setPList(
+          int index, User value) {
+        if (pListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePListIsMutable();
+          pList_.set(index, value);
+          onChanged();
+        } else {
+          pListBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder setPList(
+          int index, User.Builder builderForValue) {
+        if (pListBuilder_ == null) {
+          ensurePListIsMutable();
+          pList_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          pListBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder addPList(User value) {
+        if (pListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePListIsMutable();
+          pList_.add(value);
+          onChanged();
+        } else {
+          pListBuilder_.addMessage(value);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder addPList(
+          int index, User value) {
+        if (pListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePListIsMutable();
+          pList_.add(index, value);
+          onChanged();
+        } else {
+          pListBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder addPList(
+          User.Builder builderForValue) {
+        if (pListBuilder_ == null) {
+          ensurePListIsMutable();
+          pList_.add(builderForValue.build());
+          onChanged();
+        } else {
+          pListBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder addPList(
+          int index, User.Builder builderForValue) {
+        if (pListBuilder_ == null) {
+          ensurePListIsMutable();
+          pList_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          pListBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder addAllPList(
+          Iterable<? extends User> values) {
+        if (pListBuilder_ == null) {
+          ensurePListIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, pList_);
+          onChanged();
+        } else {
+          pListBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder clearPList() {
+        if (pListBuilder_ == null) {
+          pList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00100000);
+          onChanged();
+        } else {
+          pListBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public Builder removePList(int index) {
+        if (pListBuilder_ == null) {
+          ensurePListIsMutable();
+          pList_.remove(index);
+          onChanged();
+        } else {
+          pListBuilder_.remove(index);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public User.Builder getPListBuilder(
+          int index) {
+        return getPListFieldBuilder().getBuilder(index);
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public UserOrBuilder getPListOrBuilder(
+          int index) {
+        if (pListBuilder_ == null) {
+          return pList_.get(index);
+        } else {
+          return pListBuilder_.getMessageOrBuilder(index);
+        }
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public java.util.List<? extends UserOrBuilder>
+      getPListOrBuilderList() {
+        if (pListBuilder_ != null) {
+          return pListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(pList_);
+        }
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public User.Builder addPListBuilder() {
+        return getPListFieldBuilder().addBuilder(
+            User.getDefaultInstance());
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public User.Builder addPListBuilder(
+          int index) {
+        return getPListFieldBuilder().addBuilder(
+            index, User.getDefaultInstance());
+      }
+
+      /**
+       * <code>repeated .org.apache.servicecomb.foundation.protobuf.internal.model.User pList = 21;</code>
+       */
+      public java.util.List<User.Builder>
+      getPListBuilderList() {
+        return getPListFieldBuilder().getBuilderList();
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          User, User.Builder, UserOrBuilder>
+      getPListFieldBuilder() {
+        if (pListBuilder_ == null) {
+          pListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<>(
+              pList_,
+              ((bitField0_ & 0x00100000) == 0x00100000),
+              getParentForChildren(),
+              isClean());
+          pList_ = null;
+        }
+        return pListBuilder_;
+      }
+
+      private com.google.protobuf.Any any_ = null;
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder> anyBuilder_;
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      public boolean hasAny() {
+        return anyBuilder_ != null || any_ != null;
+      }
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      public com.google.protobuf.Any getAny() {
+        if (anyBuilder_ == null) {
+          return any_ == null ? com.google.protobuf.Any.getDefaultInstance() : any_;
+        } else {
+          return anyBuilder_.getMessage();
+        }
+      }
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      public Builder setAny(com.google.protobuf.Any value) {
+        if (anyBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          any_ = value;
+          onChanged();
+        } else {
+          anyBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      public Builder setAny(
+          com.google.protobuf.Any.Builder builderForValue) {
+        if (anyBuilder_ == null) {
+          any_ = builderForValue.build();
+          onChanged();
+        } else {
+          anyBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      public Builder mergeAny(com.google.protobuf.Any value) {
+        if (anyBuilder_ == null) {
+          if (any_ != null) {
+            any_ =
+                com.google.protobuf.Any.newBuilder(any_).mergeFrom(value).buildPartial();
+          } else {
+            any_ = value;
+          }
+          onChanged();
+        } else {
+          anyBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      public Builder clearAny() {
+        if (anyBuilder_ == null) {
+          any_ = null;
+          onChanged();
+        } else {
+          any_ = null;
+          anyBuilder_ = null;
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      public com.google.protobuf.Any.Builder getAnyBuilder() {
+
+        onChanged();
+        return getAnyFieldBuilder().getBuilder();
+      }
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      public com.google.protobuf.AnyOrBuilder getAnyOrBuilder() {
+        if (anyBuilder_ != null) {
+          return anyBuilder_.getMessageOrBuilder();
+        } else {
+          return any_ == null ?
+              com.google.protobuf.Any.getDefaultInstance() : any_;
+        }
+      }
+
+      /**
+       * <code>.google.protobuf.Any any = 22;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder>
+      getAnyFieldBuilder() {
+        if (anyBuilder_ == null) {
+          anyBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<>(
+              getAny(),
+              getParentForChildren(),
+              isClean());
+          any_ = null;
+        }
+        return anyBuilder_;
+      }
+
+      private java.util.List<com.google.protobuf.Any> anys_ =
+          java.util.Collections.emptyList();
+
+      private void ensureAnysIsMutable() {
+        if (!((bitField0_ & 0x00400000) == 0x00400000)) {
+          anys_ = new java.util.ArrayList<>(anys_);
+          bitField0_ |= 0x00400000;
+        }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder> anysBuilder_;
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public java.util.List<com.google.protobuf.Any> getAnysList() {
+        if (anysBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(anys_);
+        } else {
+          return anysBuilder_.getMessageList();
+        }
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public int getAnysCount() {
+        if (anysBuilder_ == null) {
+          return anys_.size();
+        } else {
+          return anysBuilder_.getCount();
+        }
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public com.google.protobuf.Any getAnys(int index) {
+        if (anysBuilder_ == null) {
+          return anys_.get(index);
+        } else {
+          return anysBuilder_.getMessage(index);
+        }
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder setAnys(
+          int index, com.google.protobuf.Any value) {
+        if (anysBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAnysIsMutable();
+          anys_.set(index, value);
+          onChanged();
+        } else {
+          anysBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder setAnys(
+          int index, com.google.protobuf.Any.Builder builderForValue) {
+        if (anysBuilder_ == null) {
+          ensureAnysIsMutable();
+          anys_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          anysBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder addAnys(com.google.protobuf.Any value) {
+        if (anysBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAnysIsMutable();
+          anys_.add(value);
+          onChanged();
+        } else {
+          anysBuilder_.addMessage(value);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder addAnys(
+          int index, com.google.protobuf.Any value) {
+        if (anysBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAnysIsMutable();
+          anys_.add(index, value);
+          onChanged();
+        } else {
+          anysBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder addAnys(
+          com.google.protobuf.Any.Builder builderForValue) {
+        if (anysBuilder_ == null) {
+          ensureAnysIsMutable();
+          anys_.add(builderForValue.build());
+          onChanged();
+        } else {
+          anysBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder addAnys(
+          int index, com.google.protobuf.Any.Builder builderForValue) {
+        if (anysBuilder_ == null) {
+          ensureAnysIsMutable();
+          anys_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          anysBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder addAllAnys(
+          Iterable<? extends com.google.protobuf.Any> values) {
+        if (anysBuilder_ == null) {
+          ensureAnysIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, anys_);
+          onChanged();
+        } else {
+          anysBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder clearAnys() {
+        if (anysBuilder_ == null) {
+          anys_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00400000);
+          onChanged();
+        } else {
+          anysBuilder_.clear();
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public Builder removeAnys(int index) {
+        if (anysBuilder_ == null) {
+          ensureAnysIsMutable();
+          anys_.remove(index);
+          onChanged();
+        } else {
+          anysBuilder_.remove(index);
+        }
+        return this;
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public com.google.protobuf.Any.Builder getAnysBuilder(
+          int index) {
+        return getAnysFieldBuilder().getBuilder(index);
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public com.google.protobuf.AnyOrBuilder getAnysOrBuilder(
+          int index) {
+        if (anysBuilder_ == null) {
+          return anys_.get(index);
+        } else {
+          return anysBuilder_.getMessageOrBuilder(index);
+        }
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public java.util.List<? extends com.google.protobuf.AnyOrBuilder>
+      getAnysOrBuilderList() {
+        if (anysBuilder_ != null) {
+          return anysBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(anys_);
+        }
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public com.google.protobuf.Any.Builder addAnysBuilder() {
+        return getAnysFieldBuilder().addBuilder(
+            com.google.protobuf.Any.getDefaultInstance());
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public com.google.protobuf.Any.Builder addAnysBuilder(
+          int index) {
+        return getAnysFieldBuilder().addBuilder(
+            index, com.google.protobuf.Any.getDefaultInstance());
+      }
+
+      /**
+       * <code>repeated .google.protobuf.Any anys = 23;</code>
+       */
+      public java.util.List<com.google.protobuf.Any.Builder>
+      getAnysBuilderList() {
+        return getAnysFieldBuilder().getBuilderList();
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          com.google.protobuf.Any, com.google.protobuf.Any.Builder, com.google.protobuf.AnyOrBuilder>
+      getAnysFieldBuilder() {
+        if (anysBuilder_ == null) {
+          anysBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<>(
+              anys_,
+              ((bitField0_ & 0x00400000) == 0x00400000),
+              getParentForChildren(),
+              isClean());
+          anys_ = null;
+        }
+        return anysBuilder_;
+      }
+
+      private Root typeRecursive_ = null;
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          Root, Builder, RootOrBuilder> typeRecursiveBuilder_;
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      public boolean hasTypeRecursive() {
+        return typeRecursiveBuilder_ != null || typeRecursive_ != null;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      public Root getTypeRecursive() {
+        if (typeRecursiveBuilder_ == null) {
+          return typeRecursive_ == null ? Root.getDefaultInstance() : typeRecursive_;
+        } else {
+          return typeRecursiveBuilder_.getMessage();
+        }
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      public Builder setTypeRecursive(Root value) {
+        if (typeRecursiveBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          typeRecursive_ = value;
+          onChanged();
+        } else {
+          typeRecursiveBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      public Builder setTypeRecursive(
+          Builder builderForValue) {
+        if (typeRecursiveBuilder_ == null) {
+          typeRecursive_ = builderForValue.build();
+          onChanged();
+        } else {
+          typeRecursiveBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      public Builder mergeTypeRecursive(Root value) {
+        if (typeRecursiveBuilder_ == null) {
+          if (typeRecursive_ != null) {
+            typeRecursive_ =
+                Root.newBuilder(typeRecursive_).mergeFrom(value).buildPartial();
+          } else {
+            typeRecursive_ = value;
+          }
+          onChanged();
+        } else {
+          typeRecursiveBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      public Builder clearTypeRecursive() {
+        if (typeRecursiveBuilder_ == null) {
+          typeRecursive_ = null;
+          onChanged();
+        } else {
+          typeRecursive_ = null;
+          typeRecursiveBuilder_ = null;
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      public Builder getTypeRecursiveBuilder() {
+
+        onChanged();
+        return getTypeRecursiveFieldBuilder().getBuilder();
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      public RootOrBuilder getTypeRecursiveOrBuilder() {
+        if (typeRecursiveBuilder_ != null) {
+          return typeRecursiveBuilder_.getMessageOrBuilder();
+        } else {
+          return typeRecursive_ == null ?
+              Root.getDefaultInstance() : typeRecursive_;
+        }
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 24;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          Root, Builder, RootOrBuilder>
+      getTypeRecursiveFieldBuilder() {
+        if (typeRecursiveBuilder_ == null) {
+          typeRecursiveBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<>(
+              getTypeRecursive(),
+              getParentForChildren(),
+              isClean());
+          typeRecursive_ = null;
+        }
+        return typeRecursiveBuilder_;
+      }
+
+      @Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFieldsProto3(unknownFields);
+      }
+
+      @Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:org.apache.servicecomb.foundation.protobuf.internal.model.Root)
+    }
+
+    // @@protoc_insertion_point(class_scope:org.apache.servicecomb.foundation.protobuf.internal.model.Root)
+    private static final Root DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE = new Root();
+    }
+
+    public static Root getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Root>
+        PARSER = new com.google.protobuf.AbstractParser<Root>() {
+      @Override
+      public Root parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Root(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<Root> parser() {
+      return PARSER;
+    }
+
+    @Override
+    public com.google.protobuf.Parser<Root> getParserForType() {
+      return PARSER;
+    }
+
+    @Override
+    public Root getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
+  public interface UserOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:org.apache.servicecomb.foundation.protobuf.internal.model.User)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>string name = 1;</code>
+     */
+    String getName();
+
+    /**
+     * <code>string name = 1;</code>
+     */
+    com.google.protobuf.ByteString
+    getNameBytes();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+     */
+    boolean hasTypeRecursive();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+     */
+    Root getTypeRecursive();
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+     */
+    RootOrBuilder getTypeRecursiveOrBuilder();
+  }
+
+  /**
+   * Protobuf type {@code org.apache.servicecomb.foundation.protobuf.internal.model.User}
+   */
+  public static final class User extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:org.apache.servicecomb.foundation.protobuf.internal.model.User)
+      UserOrBuilder {
+    private static final long serialVersionUID = 0L;
+
+    // Use User.newBuilder() to construct.
+    private User(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private User() {
+      name_ = "";
+    }
+
+    @Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    private User(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              String s = input.readStringRequireUtf8();
+
+              name_ = s;
+              break;
+            }
+            case 18: {
+              Root.Builder subBuilder = null;
+              if (typeRecursive_ != null) {
+                subBuilder = typeRecursive_.toBuilder();
+              }
+              typeRecursive_ = input.readMessage(Root.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(typeRecursive_);
+                typeRecursive_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownFieldProto3(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+    getDescriptor() {
+      return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_descriptor;
+    }
+
+    @Override
+    protected FieldAccessorTable
+    internalGetFieldAccessorTable() {
+      return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              User.class, Builder.class);
+    }
+
+    public static final int NAME_FIELD_NUMBER = 1;
+
+    private volatile Object name_;
+
+    /**
+     * <code>string name = 1;</code>
+     */
+    public String getName() {
+      Object ref = name_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      }
+    }
+
+    /**
+     * <code>string name = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+    getNameBytes() {
+      Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int TYPERECURSIVE_FIELD_NUMBER = 2;
+
+    private Root typeRecursive_;
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+     */
+    public boolean hasTypeRecursive() {
+      return typeRecursive_ != null;
+    }
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+     */
+    public Root getTypeRecursive() {
+      return typeRecursive_ == null ? Root.getDefaultInstance() : typeRecursive_;
+    }
+
+    /**
+     * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+     */
+    public RootOrBuilder getTypeRecursiveOrBuilder() {
+      return getTypeRecursive();
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) {
+        return true;
+      }
+      if (isInitialized == 0) {
+        return false;
+      }
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+        throws java.io.IOException {
+      if (!getNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+      }
+      if (typeRecursive_ != null) {
+        output.writeMessage(2, getTypeRecursive());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) {
+        return size;
+      }
+
+      size = 0;
+      if (!getNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+      }
+      if (typeRecursive_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(2, getTypeRecursive());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof User)) {
+        return super.equals(obj);
+      }
+      User other = (User) obj;
+
+      boolean result = true;
+      result = result && getName()
+          .equals(other.getName());
+      result = result && (hasTypeRecursive() == other.hasTypeRecursive());
+      if (hasTypeRecursive()) {
+        result = result && getTypeRecursive()
+            .equals(other.getTypeRecursive());
+      }
+      result = result && unknownFields.equals(other.unknownFields);
+      return result;
+    }
+
+    @Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      if (hasTypeRecursive()) {
+        hash = (37 * hash) + TYPERECURSIVE_FIELD_NUMBER;
+        hash = (53 * hash) + getTypeRecursive().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static User parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static User parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static User parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static User parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static User parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static User parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static User parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static User parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static User parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static User parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static User parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+
+    public static User parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(User prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @Override
+    protected Builder newBuilderForType(
+        BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+
+    /**
+     * Protobuf type {@code org.apache.servicecomb.foundation.protobuf.internal.model.User}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:org.apache.servicecomb.foundation.protobuf.internal.model.User)
+        UserOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+        return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_descriptor;
+      }
+
+      @Override
+      protected FieldAccessorTable
+      internalGetFieldAccessorTable() {
+        return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                User.class, Builder.class);
+      }
+
+      // Construct using org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot.User.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+            .alwaysUseFieldBuilders) {
+        }
+      }
+
+      @Override
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+
+        if (typeRecursiveBuilder_ == null) {
+          typeRecursive_ = null;
+        } else {
+          typeRecursive_ = null;
+          typeRecursiveBuilder_ = null;
+        }
+        return this;
+      }
+
+      @Override
+      public com.google.protobuf.Descriptors.Descriptor
+      getDescriptorForType() {
+        return ProtobufRoot.internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_descriptor;
+      }
+
+      @Override
+      public User getDefaultInstanceForType() {
+        return User.getDefaultInstance();
+      }
+
+      @Override
+      public User build() {
+        User result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @Override
+      public User buildPartial() {
+        User result = new User(this);
+        result.name_ = name_;
+        if (typeRecursiveBuilder_ == null) {
+          result.typeRecursive_ = typeRecursive_;
+        } else {
+          result.typeRecursive_ = typeRecursiveBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @Override
+      public Builder clone() {
+        return (Builder) super.clone();
+      }
+
+      @Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          Object value) {
+        return (Builder) super.setField(field, value);
+      }
+
+      @Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return (Builder) super.clearField(field);
+      }
+
+      @Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return (Builder) super.clearOneof(oneof);
+      }
+
+      @Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, Object value) {
+        return (Builder) super.setRepeatedField(field, index, value);
+      }
+
+      @Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          Object value) {
+        return (Builder) super.addRepeatedField(field, value);
+      }
+
+      @Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof User) {
+          return mergeFrom((User) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(User other) {
+        if (other == User.getDefaultInstance()) {
+          return this;
+        }
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          onChanged();
+        }
+        if (other.hasTypeRecursive()) {
+          mergeTypeRecursive(other.getTypeRecursive());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        User parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (User) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private Object name_ = "";
+
+      /**
+       * <code>string name = 1;</code>
+       */
+      public String getName() {
+        Object ref = name_;
+        if (!(ref instanceof String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+
+      /**
+       * <code>string name = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+      getNameBytes() {
+        Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      /**
+       * <code>string name = 1;</code>
+       */
+      public Builder setName(
+          String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>string name = 1;</code>
+       */
+      public Builder clearName() {
+
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>string name = 1;</code>
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      private Root typeRecursive_ = null;
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          Root, Root.Builder, RootOrBuilder> typeRecursiveBuilder_;
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      public boolean hasTypeRecursive() {
+        return typeRecursiveBuilder_ != null || typeRecursive_ != null;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      public Root getTypeRecursive() {
+        if (typeRecursiveBuilder_ == null) {
+          return typeRecursive_ == null ? Root.getDefaultInstance() : typeRecursive_;
+        } else {
+          return typeRecursiveBuilder_.getMessage();
+        }
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      public Builder setTypeRecursive(Root value) {
+        if (typeRecursiveBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          typeRecursive_ = value;
+          onChanged();
+        } else {
+          typeRecursiveBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      public Builder setTypeRecursive(
+          Root.Builder builderForValue) {
+        if (typeRecursiveBuilder_ == null) {
+          typeRecursive_ = builderForValue.build();
+          onChanged();
+        } else {
+          typeRecursiveBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      public Builder mergeTypeRecursive(Root value) {
+        if (typeRecursiveBuilder_ == null) {
+          if (typeRecursive_ != null) {
+            typeRecursive_ =
+                Root.newBuilder(typeRecursive_).mergeFrom(value).buildPartial();
+          } else {
+            typeRecursive_ = value;
+          }
+          onChanged();
+        } else {
+          typeRecursiveBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      public Builder clearTypeRecursive() {
+        if (typeRecursiveBuilder_ == null) {
+          typeRecursive_ = null;
+          onChanged();
+        } else {
+          typeRecursive_ = null;
+          typeRecursiveBuilder_ = null;
+        }
+
+        return this;
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      public Root.Builder getTypeRecursiveBuilder() {
+
+        onChanged();
+        return getTypeRecursiveFieldBuilder().getBuilder();
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      public RootOrBuilder getTypeRecursiveOrBuilder() {
+        if (typeRecursiveBuilder_ != null) {
+          return typeRecursiveBuilder_.getMessageOrBuilder();
+        } else {
+          return typeRecursive_ == null ?
+              Root.getDefaultInstance() : typeRecursive_;
+        }
+      }
+
+      /**
+       * <code>.org.apache.servicecomb.foundation.protobuf.internal.model.Root typeRecursive = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          Root, Root.Builder, RootOrBuilder>
+      getTypeRecursiveFieldBuilder() {
+        if (typeRecursiveBuilder_ == null) {
+          typeRecursiveBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<>(
+              getTypeRecursive(),
+              getParentForChildren(),
+              isClean());
+          typeRecursive_ = null;
+        }
+        return typeRecursiveBuilder_;
+      }
+
+      @Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFieldsProto3(unknownFields);
+      }
+
+      @Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:org.apache.servicecomb.foundation.protobuf.internal.model.User)
+    }
+
+    // @@protoc_insertion_point(class_scope:org.apache.servicecomb.foundation.protobuf.internal.model.User)
+    private static final User DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE = new User();
+    }
+
+    public static User getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<User>
+        PARSER = new com.google.protobuf.AbstractParser<User>() {
+      @Override
+      public User parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new User(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<User> parser() {
+      return PARSER;
+    }
+
+    @Override
+    public com.google.protobuf.Parser<User> getParserForType() {
+      return PARSER;
+    }
+
+    @Override
+    public User getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_descriptor;
+
+  private static final
+  com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_fieldAccessorTable;
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SsMapEntry_descriptor;
+
+  private static final
+  com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SsMapEntry_fieldAccessorTable;
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SpMapEntry_descriptor;
+
+  private static final
+  com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SpMapEntry_fieldAccessorTable;
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_descriptor;
+
+  private static final
+  com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+  getDescriptor() {
+    return descriptor;
+  }
+
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+
+  static {
+    String[] descriptorData = {
+        "\n\022protobufRoot.proto\0229org.apache.service" +
+            "comb.foundation.protobuf.internal.model\032" +
+            "\031google/protobuf/any.proto\"\361\007\n\004Root\022\r\n\005i" +
+            "nt32\030\001 \001(\005\022\r\n\005int64\030\002 \001(\003\022\016\n\006uint32\030\003 \001(" +
+            "\r\022\016\n\006uint64\030\004 \001(\004\022\016\n\006sint32\030\005 \001(\021\022\016\n\006sin" +
+            "t64\030\006 \001(\022\022\017\n\007fixed32\030\007 \001(\007\022\017\n\007fixed64\030\010 " +
+            "\001(\006\022\020\n\010sfixed32\030\t \001(\017\022\020\n\010sfixed64\030\n \001(\020\022" +
+            "\022\n\nfloatValue\030\013 \001(\002\022\023\n\013doubleValue\030\014 \001(\001" +
+            "\022\014\n\004bool\030\r \001(\010\022\016\n\006string\030\016 \001(\t\022\r\n\005bytes\030" +
+            "\017 \001(\014\022O\n\005color\030\020 \001(\0162@.org.apache.servic" +
+            "ecomb.foundation.protobuf.internal.model" +
+            ".Color\022M\n\004user\030\021 \001(\0132?.org.apache.servic" +
+            "ecomb.foundation.protobuf.internal.model" +
+            ".User\022Y\n\005ssMap\030\022 \003(\0132J.org.apache.servic" +
+            "ecomb.foundation.protobuf.internal.model" +
+            ".Root.SsMapEntry\022Y\n\005spMap\030\023 \003(\0132J.org.ap" +
+            "ache.servicecomb.foundation.protobuf.int" +
+            "ernal.model.Root.SpMapEntry\022\r\n\005sList\030\024 \003" +
+            "(\t\022N\n\005pList\030\025 \003(\0132?.org.apache.serviceco" +
+            "mb.foundation.protobuf.internal.model.Us" +
+            "er\022!\n\003any\030\026 \001(\0132\024.google.protobuf.Any\022\"\n" +
+            "\004anys\030\027 \003(\0132\024.google.protobuf.Any\022V\n\rtyp" +
+            "eRecursive\030\030 \001(\0132?.org.apache.servicecom" +
+            "b.foundation.protobuf.internal.model.Roo" +
+            "t\032,\n\nSsMapEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 " +
+            "\001(\t:\0028\001\032m\n\nSpMapEntry\022\013\n\003key\030\001 \001(\t\022N\n\005va" +
+            "lue\030\002 \001(\0132?.org.apache.servicecomb.found" +
+            "ation.protobuf.internal.model.User:\0028\001\"l" +
+            "\n\004User\022\014\n\004name\030\001 \001(\t\022V\n\rtypeRecursive\030\002 " +
+            "\001(\0132?.org.apache.servicecomb.foundation." +
+            "protobuf.internal.model.Root*&\n\005Color\022\007\n" +
+            "\003RED\020\000\022\n\n\006YELLOW\020\001\022\010\n\004BLUE\020\002b\006proto3"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+        new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+          public com.google.protobuf.ExtensionRegistry assignDescriptors(
+              com.google.protobuf.Descriptors.FileDescriptor root) {
+            descriptor = root;
+            return null;
+          }
+        };
+    com.google.protobuf.Descriptors.FileDescriptor
+        .internalBuildGeneratedFileFrom(descriptorData,
+            new com.google.protobuf.Descriptors.FileDescriptor[] {
+                com.google.protobuf.AnyProto.getDescriptor(),
+            }, assigner);
+    internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_descriptor =
+        getDescriptor().getMessageTypes().get(0);
+    internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_fieldAccessorTable = new
+        com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_descriptor,
+        new String[] {"Int32", "Int64", "Uint32", "Uint64", "Sint32", "Sint64", "Fixed32", "Fixed64", "Sfixed32",
+            "Sfixed64", "FloatValue", "DoubleValue", "Bool", "String", "Bytes", "Color", "User", "SsMap", "SpMap",
+            "SList", "PList", "Any", "Anys", "TypeRecursive",});
+    internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SsMapEntry_descriptor =
+        internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_descriptor.getNestedTypes()
+            .get(0);
+    internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SsMapEntry_fieldAccessorTable = new
+        com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SsMapEntry_descriptor,
+        new String[] {"Key", "Value",});
+    internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SpMapEntry_descriptor =
+        internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_descriptor.getNestedTypes()
+            .get(1);
+    internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SpMapEntry_fieldAccessorTable = new
+        com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_Root_SpMapEntry_descriptor,
+        new String[] {"Key", "Value",});
+    internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_descriptor =
+        getDescriptor().getMessageTypes().get(1);
+    internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_fieldAccessorTable = new
+        com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_org_apache_servicecomb_foundation_protobuf_internal_model_User_descriptor,
+        new String[] {"Name", "TypeRecursive",});
+    com.google.protobuf.AnyProto.getDescriptor();
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/Root.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/Root.java
new file mode 100644
index 000000000..d4241ddd1
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/Root.java
@@ -0,0 +1,262 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.model;
+
+import java.util.List;
+import java.util.Map;
+
+public class Root {
+  private int int32;
+
+  private long int64;
+
+  private int uint32;
+
+  private long uint64;
+
+  private int sint32;
+
+  private long sint64;
+
+  private int fixed32;
+
+  private long fixed64;
+
+  private int sfixed32;
+
+  private long sfixed64;
+
+  private float floatValue;
+
+  private double doubleValue;
+
+  private boolean bool;
+
+  private String string;
+
+  private byte[] bytes;
+
+  private Color color;
+
+  private User user;
+
+  private Map<String, String> ssMap;
+
+  private Map<String, User> spMap;
+
+  private List<String> sList;
+
+  private List<User> pList;
+
+  private Object any;
+
+  private List<Object> anys;
+
+  private Root typeRecursive;
+
+  public int getInt32() {
+    return int32;
+  }
+
+  public void setInt32(int int32) {
+    this.int32 = int32;
+  }
+
+  public long getInt64() {
+    return int64;
+  }
+
+  public void setInt64(long int64) {
+    this.int64 = int64;
+  }
+
+  public int getUint32() {
+    return uint32;
+  }
+
+  public void setUint32(int uint32) {
+    this.uint32 = uint32;
+  }
+
+  public long getUint64() {
+    return uint64;
+  }
+
+  public void setUint64(long uint64) {
+    this.uint64 = uint64;
+  }
+
+  public int getSint32() {
+    return sint32;
+  }
+
+  public void setSint32(int sint32) {
+    this.sint32 = sint32;
+  }
+
+  public long getSint64() {
+    return sint64;
+  }
+
+  public void setSint64(long sint64) {
+    this.sint64 = sint64;
+  }
+
+  public int getFixed32() {
+    return fixed32;
+  }
+
+  public void setFixed32(int fixed32) {
+    this.fixed32 = fixed32;
+  }
+
+  public long getFixed64() {
+    return fixed64;
+  }
+
+  public void setFixed64(long fixed64) {
+    this.fixed64 = fixed64;
+  }
+
+  public int getSfixed32() {
+    return sfixed32;
+  }
+
+  public void setSfixed32(int sfixed32) {
+    this.sfixed32 = sfixed32;
+  }
+
+  public long getSfixed64() {
+    return sfixed64;
+  }
+
+  public void setSfixed64(long sfixed64) {
+    this.sfixed64 = sfixed64;
+  }
+
+  public float getFloatValue() {
+    return floatValue;
+  }
+
+  public void setFloatValue(float floatValue) {
+    this.floatValue = floatValue;
+  }
+
+  public double getDoubleValue() {
+    return doubleValue;
+  }
+
+  public void setDoubleValue(double doubleValue) {
+    this.doubleValue = doubleValue;
+  }
+
+  public boolean isBool() {
+    return bool;
+  }
+
+  public void setBool(boolean bool) {
+    this.bool = bool;
+  }
+
+  public String getString() {
+    return string;
+  }
+
+  public void setString(String string) {
+    this.string = string;
+  }
+
+  public byte[] getBytes() {
+    return bytes;
+  }
+
+  public void setBytes(byte[] bytes) {
+    this.bytes = bytes;
+  }
+
+  public Color getColor() {
+    return color;
+  }
+
+  public void setColor(Color color) {
+    this.color = color;
+  }
+
+  public User getUser() {
+    return user;
+  }
+
+  public void setUser(User user) {
+    this.user = user;
+  }
+
+  public Map<String, String> getSsMap() {
+    return ssMap;
+  }
+
+  public void setSsMap(Map<String, String> ssMap) {
+    this.ssMap = ssMap;
+  }
+
+  public Map<String, User> getSpMap() {
+    return spMap;
+  }
+
+  public void setSpMap(Map<String, User> spMap) {
+    this.spMap = spMap;
+  }
+
+  public List<String> getsList() {
+    return sList;
+  }
+
+  public void setsList(List<String> sList) {
+    this.sList = sList;
+  }
+
+  public List<User> getpList() {
+    return pList;
+  }
+
+  public void setpList(List<User> pList) {
+    this.pList = pList;
+  }
+
+  public Object getAny() {
+    return any;
+  }
+
+  public void setAny(Object any) {
+    this.any = any;
+  }
+
+  public List<Object> getAnys() {
+    return anys;
+  }
+
+  public void setAnys(List<Object> anys) {
+    this.anys = anys;
+  }
+
+  public Root getTypeRecursive() {
+    return typeRecursive;
+  }
+
+  public void setTypeRecursive(Root typeRecursive) {
+    this.typeRecursive = typeRecursive;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/User.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/User.java
new file mode 100644
index 000000000..642d38128
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/User.java
@@ -0,0 +1,51 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.model;
+
+public class User {
+  private String name;
+
+  private Root typeRecursive;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public User name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  public Root getTypeRecursive() {
+    return typeRecursive;
+  }
+
+  public void setTypeRecursive(Root typeRecursive) {
+    this.typeRecursive = typeRecursive;
+  }
+
+  @Override
+  public String toString() {
+    return "User{" +
+        "name='" + name + '\'' +
+        '}';
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestAnySchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestAnySchema.java
new file mode 100644
index 000000000..fb2868ebf
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestAnySchema.java
@@ -0,0 +1,102 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.RootDeserializer;
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
+import org.apache.servicecomb.foundation.protobuf.internal.model.Root;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.protobuf.Any;
+
+public class TestAnySchema extends TestSchemaBase {
+  public TestAnySchema() {
+    initField("any");
+  }
+
+  @Test
+  public void empty() throws Throwable {
+    Assert.assertEquals(0, serFieldSchema.writeTo(null).length);
+  }
+
+  @Test
+  public void anys_pack() throws IOException {
+    builder
+        .addAnys(Any.pack(ProtobufRoot.User.newBuilder().setName("n1").build()))
+        .addAnys(Any.pack(ProtobufRoot.User.newBuilder().setName("n2").build()));
+    check();
+  }
+
+  @Test
+  public void anys_json() throws IOException {
+    Root root = new Root();
+    root.setAnys(Arrays.asList("abc", "123"));
+
+    scbRootBytes = rootSerializer.serialize(root);
+    root = rootDeserializer.deserialize(scbRootBytes);
+    Assert.assertThat(root.getAnys(), Matchers.contains("abc", "123"));
+  }
+
+  @Test
+  public void pack() throws Throwable {
+    builder.setAny(Any.pack(ProtobufRoot.User.newBuilder().setName("n1").build()));
+    check();
+
+    Map<String, Object> map = new HashMap<>();
+    map.put("@type", "User");
+    map.put("name", "n1");
+    Root root = new Root();
+    root.setAny(map);
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(root));
+  }
+
+  @SuppressWarnings("unchecked")
+  @Test
+  public void json_fromMapWithoutType() throws Throwable {
+    Map<String, Object> map = new HashMap<>();
+    map.put("name", "n1");
+    Root root = new Root();
+    root.setAny(map);
+
+    scbRootBytes = rootSerializer.serialize(root);
+    root = rootDeserializer.deserialize(scbRootBytes);
+    Assert.assertThat(root.getAny(), Matchers.instanceOf(Map.class));
+    Assert.assertThat((Map<? extends String, ? extends String>) root.getAny(), Matchers.hasEntry("name", "n1"));
+
+    RootDeserializer deserializer = protoMapper.createRootDeserializer(Map.class, "Root");
+    map = deserializer.deserialize(scbRootBytes);
+    Assert.assertThat((Map<? extends String, ? extends String>) map.get("any"), Matchers.hasEntry("name", "n1"));
+  }
+
+  @Test
+  public void json() throws Throwable {
+    Root root = new Root();
+    root.setAny("abc");
+
+    scbRootBytes = rootSerializer.serialize(root);
+    root = rootDeserializer.deserialize(scbRootBytes);
+    Assert.assertEquals("abc", root.getAny());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMapSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMapSchema.java
new file mode 100644
index 000000000..cdd9e5246
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMapSchema.java
@@ -0,0 +1,44 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
+import org.junit.Test;
+
+public class TestMapSchema extends TestSchemaBase {
+  @Test
+  public void ssMap() throws Throwable {
+    Map<String, String> ssMap = new HashMap<>();
+    ssMap.put("k1", "v1");
+    ssMap.put("k2", "v2");
+    builder.putAllSsMap(ssMap);
+
+    check();
+  }
+
+  @Test
+  public void spMap() throws Throwable {
+    builder.putSpMap("k1", ProtobufRoot.User.newBuilder().setName("n1").build());
+    builder.putSpMap("k2", ProtobufRoot.User.newBuilder().setName("n2").build());
+
+    check();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMessageSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMessageSchema.java
new file mode 100644
index 000000000..8da3a5d71
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMessageSchema.java
@@ -0,0 +1,76 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.RootDeserializer;
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.CustomGeneric;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
+import org.apache.servicecomb.foundation.protobuf.internal.model.User;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+public class TestMessageSchema extends TestSchemaBase {
+  @Test
+  public void empty() throws Throwable {
+    check();
+
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(null));
+  }
+
+  @Test
+  public void generic() throws Throwable {
+    JavaType javaType = TypeFactory.defaultInstance().constructParametricType(CustomGeneric.class, User.class);
+    RootDeserializer genericDeserializer = protoMapper.createRootDeserializer(javaType, "Root");
+
+    builder.setUser(ProtobufRoot.User.newBuilder().setName("name1").build());
+    check(genericDeserializer, mapRootDeserializer, rootSerializer, false);
+
+    @SuppressWarnings("unchecked")
+    CustomGeneric<User> generic = (CustomGeneric<User>) scbRoot;
+    Assert.assertThat(generic.user, Matchers.instanceOf(User.class));
+  }
+
+  @Test
+  public void normal() throws Throwable {
+    builder.setString("abc");
+    builder.setInt64(1L);
+    builder.setUser(ProtobufRoot.User.newBuilder().setName("name").build());
+
+    check();
+
+    // map
+    Map<String, Object> map = new LinkedHashMap<>();
+    map.put("int64", 1);
+    map.put("string", "abc");
+
+    Map<String, Object> userMap = new LinkedHashMap<>();
+    userMap.put("name", "name");
+    map.put("user", userMap);
+
+    map.put("notExist", null);
+
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(map));
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestRepeatedSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestRepeatedSchema.java
new file mode 100644
index 000000000..48e4c0543
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestRepeatedSchema.java
@@ -0,0 +1,50 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestRepeatedSchema extends TestSchemaBase {
+  public static class RootWithArray {
+    public String[] sList;
+  }
+
+  @Test
+  public void sList() throws Throwable {
+    List<String> sList = Arrays.asList("v1", "v2");
+    builder.addAllSList(sList);
+    check();
+
+    RootWithArray rootWithArray = new RootWithArray();
+    rootWithArray.sList = (String[]) sList.toArray();
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(rootWithArray));
+  }
+
+  @Test
+  public void pList() throws Throwable {
+    builder.addPList(ProtobufRoot.User.newBuilder().setName("name1").build());
+    builder.addPList(ProtobufRoot.User.newBuilder().setName("name2").build());
+
+    check();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestBoolSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestBoolSchema.java
new file mode 100644
index 000000000..fd9df9f57
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestBoolSchema.java
@@ -0,0 +1,78 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.User;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestBoolSchema extends TestSchemaBase {
+  public TestBoolSchema() {
+    initField("bool");
+  }
+
+  @Test
+  public void testTrue() throws Throwable {
+    // normal
+    builder.setBool(true);
+    check();
+
+    // equalsIgnoreCase
+    doTestFromString("true");
+    doTestFromString("trUe");
+  }
+
+  @Test
+  public void testFalse() throws Throwable {
+    // normal
+    builder.setBool(false);
+    check();
+
+    // all not true is false
+    doTestFromString("false");
+    doTestFromString("abcd");
+  }
+
+  protected void doTestFromString(String value) throws Throwable {
+    // string[]
+    Assert.assertArrayEquals(protobufBytes, serFieldSchema.writeTo(new String[] {value}));
+
+    // string
+    Assert.assertArrayEquals(protobufBytes, serFieldSchema.writeTo(value));
+  }
+
+  @Test
+  public void nullOrEmpty() throws Throwable {
+    // null
+    Assert.assertEquals(0, serFieldSchema.writeTo(null).length);
+
+    // empty string[]
+    Assert.assertEquals(0, serFieldSchema.writeTo(new String[] {}).length);
+  }
+
+  @Test
+  public void type_invalid() throws Throwable {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers
+        .is("not support serialize from org.apache.servicecomb.foundation.protobuf.internal.model.User to proto bool, field=org.apache.servicecomb.foundation.protobuf.internal.model.Root:bool"));
+
+    serFieldSchema.writeTo(new User());
+  }
+}
+
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestBytesSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestBytesSchema.java
new file mode 100644
index 000000000..d94658201
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestBytesSchema.java
@@ -0,0 +1,50 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.User;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.protobuf.ByteString;
+
+public class TestBytesSchema extends TestSchemaBase {
+  public TestBytesSchema() {
+    initField("bytes");
+  }
+
+  @Test
+  public void normal() throws Throwable {
+    byte[] value = "abc".getBytes();
+    builder.setBytes(ByteString.copyFrom(value));
+    check();
+
+    // null
+    Assert.assertEquals(0, serFieldSchema.writeTo(null).length);
+  }
+
+  @Test
+  public void type_invalid() throws Throwable {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers
+        .is("not support serialize from org.apache.servicecomb.foundation.protobuf.internal.model.User to proto bytes, field=org.apache.servicecomb.foundation.protobuf.internal.model.Root:bytes"));
+
+    serFieldSchema.writeTo(new User());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestDoubleSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestDoubleSchema.java
new file mode 100644
index 000000000..28fa06206
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestDoubleSchema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestDoubleSchema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "doubleValue";
+    minValue = Double.MIN_VALUE;
+    maxValue = Double.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFixed32Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFixed32Schema.java
new file mode 100644
index 000000000..20f67ac80
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFixed32Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestFixed32Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "fixed32";
+    minValue = Integer.MIN_VALUE;
+    maxValue = Integer.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFixed64Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFixed64Schema.java
new file mode 100644
index 000000000..fdc14786f
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFixed64Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestFixed64Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "fixed64";
+    minValue = Long.MIN_VALUE;
+    maxValue = Long.MAX_VALUE;
+    super.init();
+  }
+}
\ No newline at end of file
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFloatSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFloatSchema.java
new file mode 100644
index 000000000..9cfab25d5
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestFloatSchema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestFloatSchema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "floatValue";
+    minValue = Float.MIN_VALUE;
+    maxValue = Float.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestInt32Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestInt32Schema.java
new file mode 100644
index 000000000..c4bd0c231
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestInt32Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestInt32Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "int32";
+    minValue = Integer.MIN_VALUE;
+    maxValue = Integer.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestInt64Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestInt64Schema.java
new file mode 100644
index 000000000..68fa3b283
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestInt64Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestInt64Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "int64";
+    minValue = Long.MIN_VALUE;
+    maxValue = Long.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestNumberBaseSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestNumberBaseSchema.java
new file mode 100644
index 000000000..2abc07c47
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestNumberBaseSchema.java
@@ -0,0 +1,107 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import java.lang.reflect.Method;
+import java.util.Locale;
+
+import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.User;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import io.protostuff.compiler.model.Type;
+
+@Ignore
+public abstract class TestNumberBaseSchema extends TestSchemaBase {
+  protected String fieldName;
+
+  protected Object minValue;
+
+  protected Object maxValue;
+
+  public TestNumberBaseSchema() {
+    init();
+  }
+
+  protected void init() {
+    initField(fieldName);
+  }
+
+  @Test
+  public void normal() throws Throwable {
+    // normal
+    Object value = doTestNormal();
+
+    // null
+    Assert.assertEquals(0, serFieldSchema.writeTo(null).length);
+
+    // empty string[]
+    Assert.assertEquals(0, serFieldSchema.writeTo(new String[] {}).length);
+
+    // string[]
+    Assert.assertArrayEquals(protobufBytes, serFieldSchema.writeTo(new String[] {String.valueOf(value)}));
+
+    // string
+    Assert.assertArrayEquals(protobufBytes, serFieldSchema.writeTo(String.valueOf(value)));
+  }
+
+  protected Object doTestNormal() throws Throwable {
+    String setName = "set" + fieldName.substring(0, 1).toUpperCase(Locale.US) + fieldName.substring(1);
+    Method builderSetter = ReflectUtils.findMethod(builder.getClass(), setName);
+
+    builderSetter.invoke(builder, minValue);
+    check();
+
+    builderSetter.invoke(builder, maxValue);
+    check();
+
+    return maxValue;
+  }
+
+  @Test
+  public void strings_invalid() throws Throwable {
+    expectedException.expect(NumberFormatException.class);
+    expectedException.expectMessage(Matchers.is("For input string: \"a\""));
+
+    serFieldSchema.writeTo(new String[] {"a"});
+  }
+
+  @Test
+  public void string_invalid() throws Throwable {
+    expectedException.expect(NumberFormatException.class);
+    expectedException.expectMessage(Matchers.is("For input string: \"a\""));
+
+    serFieldSchema.writeTo("a");
+  }
+
+  @Test
+  public void type_invalid() throws Throwable {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers
+        .is(String.format("not support serialize from %s to proto %s, field=%s:%s",
+            User.class.getName(),
+            serFieldSchema.getProtoField().getTypeName(),
+            ((Type) serFieldSchema.getProtoField().getParent()).getCanonicalName(),
+            serFieldSchema.getProtoField().getName())));
+
+    serFieldSchema.writeTo(new User());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSFixed32Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSFixed32Schema.java
new file mode 100644
index 000000000..005ab6de9
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSFixed32Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestSFixed32Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "sfixed32";
+    minValue = Integer.MIN_VALUE;
+    maxValue = Integer.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSFixed64Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSFixed64Schema.java
new file mode 100644
index 000000000..414e5edfb
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSFixed64Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestSFixed64Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "sfixed64";
+    minValue = Long.MIN_VALUE;
+    maxValue = Long.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSInt32Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSInt32Schema.java
new file mode 100644
index 000000000..7382bbef8
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSInt32Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestSInt32Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "sint32";
+    minValue = Integer.MIN_VALUE;
+    maxValue = Integer.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSInt64Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSInt64Schema.java
new file mode 100644
index 000000000..d1ce32caf
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestSInt64Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestSInt64Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "sint64";
+    minValue = Long.MIN_VALUE;
+    maxValue = Long.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestStringSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestStringSchema.java
new file mode 100644
index 000000000..4eaea1109
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestStringSchema.java
@@ -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.
+ */
+package org.apache.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.User;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestStringSchema extends TestSchemaBase {
+  public TestStringSchema() {
+    initField("string");
+  }
+
+  @Test
+  public void normal() throws Throwable {
+    String value = "abc";
+    builder.setString(value);
+    check();
+
+    // string[]
+    Assert.assertArrayEquals(protobufBytes, serFieldSchema.writeTo(new String[] {value}));
+
+    // string
+    Assert.assertArrayEquals(protobufBytes, serFieldSchema.writeTo(value));
+  }
+
+  @Test
+  public void nullOrEmpty() throws Throwable {
+    // null
+    Assert.assertEquals(0, serFieldSchema.writeTo(null).length);
+
+    // empty string[]
+    Assert.assertEquals(0, serFieldSchema.writeTo(new String[] {}).length);
+  }
+
+  @Test
+  public void type_invalid() throws Throwable {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers
+        .is("not support serialize from org.apache.servicecomb.foundation.protobuf.internal.model.User to proto string, field=org.apache.servicecomb.foundation.protobuf.internal.model.Root:string"));
+
+    serFieldSchema.writeTo(new User());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestUInt32Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestUInt32Schema.java
new file mode 100644
index 000000000..84c196383
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestUInt32Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestUInt32Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "uint32";
+    minValue = Integer.MIN_VALUE;
+    maxValue = Integer.MAX_VALUE;
+    super.init();
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestUInt64Schema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestUInt64Schema.java
new file mode 100644
index 000000000..f22d81056
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/scalar/TestUInt64Schema.java
@@ -0,0 +1,27 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.scalar;
+
+public class TestUInt64Schema extends TestNumberBaseSchema {
+  @Override
+  protected void init() {
+    fieldName = "uint64";
+    minValue = Long.MIN_VALUE;
+    maxValue = Long.MAX_VALUE;
+    super.init();
+  }
+}
\ No newline at end of file
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/TestEnumSerializerSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/TestEnumSerializerSchema.java
new file mode 100644
index 000000000..85ec3f771
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/TestEnumSerializerSchema.java
@@ -0,0 +1,85 @@
+/*
+ * 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.servicecomb.foundation.protobuf.internal.schema.serializer;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
+import org.apache.servicecomb.foundation.protobuf.internal.model.User;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestEnumSerializerSchema extends TestSchemaBase {
+  public TestEnumSerializerSchema() {
+    initField("color");
+  }
+
+  @Test
+  public void empty() throws Throwable {
+    Assert.assertEquals(0, serFieldSchema.writeTo(null).length);
+    Assert.assertEquals(0, serFieldSchema.writeTo(new String[0]).length);
+  }
+
+  @Test
+  public void normal() throws Throwable {
+    builder.setColorValue(2);
+    check();
+
+    Map<String, Object> map = new HashMap<>();
+    map.put("color", 2);
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(map));
+
+    map.put("color", new String[] {"BLUE"});
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(map));
+
+    map.put("color", "BLUE");
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(map));
+  }
+
+  enum Sharp {
+    ROUND
+  }
+
+  @Test
+  public void fromInvalidEnum() throws Throwable {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers
+        .is("invalid enum name ROUND for proto Color, field=org.apache.servicecomb.foundation.protobuf.internal.model.Root:color"));
+
+    serFieldSchema.writeTo(Sharp.ROUND);
+  }
+
+  @Test
+  public void fromInvalidNumber() throws Throwable {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers
+        .is("invalid enum value 3 for proto Color, field=org.apache.servicecomb.foundation.protobuf.internal.model.Root:color"));
+
+    serFieldSchema.writeTo(3);
+  }
+
+  @Test
+  public void type_invalid() throws Throwable {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers
+        .is("not support serialize from org.apache.servicecomb.foundation.protobuf.internal.model.User to proto Color, field=org.apache.servicecomb.foundation.protobuf.internal.model.Root:color"));
+
+    serFieldSchema.writeTo(new User());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/ProtubufCodecEngine.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/ProtubufCodecEngine.java
new file mode 100644
index 000000000..783d4aad7
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/ProtubufCodecEngine.java
@@ -0,0 +1,25 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance;
+
+import java.io.IOException;
+
+public interface ProtubufCodecEngine {
+  byte[] serialize(Object model) throws IOException;
+
+  Object deserialize(byte[] bytes) throws IOException;
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestBase.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestBase.java
new file mode 100644
index 000000000..c8c810c65
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestBase.java
@@ -0,0 +1,103 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
+import org.apache.servicecomb.foundation.protobuf.internal.model.Root;
+import org.apache.servicecomb.foundation.protobuf.performance.engine.Jackson;
+import org.apache.servicecomb.foundation.protobuf.performance.engine.Protobuf;
+import org.apache.servicecomb.foundation.protobuf.performance.engine.Protostuff;
+import org.apache.servicecomb.foundation.protobuf.performance.engine.ScbStrong;
+import org.apache.servicecomb.foundation.protobuf.performance.engine.ScbWeak;
+
+public abstract class TestBase {
+  public interface Case {
+    TestEngineResult run();
+  }
+
+  static ProtubufCodecEngine scbStrong = new ScbStrong();
+
+  static ProtubufCodecEngine scbWeak = new ScbWeak();
+
+  static ProtubufCodecEngine protoStuff = new Protostuff();
+
+  static ProtubufCodecEngine protobuf = new Protobuf();
+
+  static ProtubufCodecEngine jackson = new Jackson();
+
+  protected Root pojoRoot = new Root();
+
+  protected Map<String, Object> pojoRootMap;
+
+  protected ProtobufRoot.Root.Builder builder = ProtobufRoot.Root.newBuilder();
+
+  @SuppressWarnings("unchecked")
+  public TestResult run(int count) throws IOException {
+    pojoRootMap = (Map<String, Object>) Jackson.jsonMapper.convertValue(pojoRoot, Map.class);
+    // warm
+    doRun(10_000);
+
+    // real test
+    return doRun(count);
+  }
+
+  private TestResult doRun(int count) throws IOException {
+    TestResult testResult = new TestResult();
+    testResult.name = this.getClass().getSimpleName();
+
+    testResult.addTestEngineResult(runOneEngine(protoStuff, pojoRoot, count));
+    testResult.addTestEngineResult(runOneEngine(scbStrong, pojoRoot, count));
+    testResult.addTestEngineResult(runOneEngine(scbWeak, pojoRootMap, count));
+    testResult.addTestEngineResult(runOneEngine(protobuf, builder, count));
+    testResult.addTestEngineResult(runOneEngine(jackson, pojoRoot, count));
+    return testResult;
+  }
+
+  private TestEngineResult runOneEngine(ProtubufCodecEngine engine, Object model, int count)
+      throws IOException {
+    TestEngineResult engineResult = new TestEngineResult();
+    engineResult.engineName = engine.getClass().getSimpleName();
+
+    // serialize
+    {
+      long msStart = System.currentTimeMillis();
+      for (int idx = 0; idx < count; idx++) {
+        engineResult.serBytes = engine.serialize(model);
+      }
+      long msEnd = System.currentTimeMillis();
+
+      engineResult.msSerTime = msEnd - msStart;
+    }
+
+    // deserialize
+    {
+      long msStart = System.currentTimeMillis();
+      for (int idx = 0; idx < count; idx++) {
+        engineResult.deserResult = engine.deserialize(engineResult.serBytes);
+      }
+      long msEnd = System.currentTimeMillis();
+
+      engineResult.msDeserTime = msEnd - msStart;
+    }
+
+    engineResult.deserResultBytes = engine.serialize(engineResult.deserResult);
+    return engineResult;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestEngineResult.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestEngineResult.java
new file mode 100644
index 000000000..ffa08506d
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestEngineResult.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.servicecomb.foundation.protobuf.performance;
+
+public class TestEngineResult {
+  public String engineName;
+
+  // serialize
+  public long msSerTime;
+
+  public byte[] serBytes;
+
+  // deserialize
+  public long msDeserTime;
+
+  public Object deserResult;
+
+  public byte[] deserResultBytes;
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestProtoPerformance.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestProtoPerformance.java
new file mode 100644
index 000000000..276821e97
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestProtoPerformance.java
@@ -0,0 +1,74 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.performance.cases.Empty;
+import org.apache.servicecomb.foundation.protobuf.performance.cases.Map;
+import org.apache.servicecomb.foundation.protobuf.performance.cases.Mixed;
+import org.apache.servicecomb.foundation.protobuf.performance.cases.PojoList;
+import org.apache.servicecomb.foundation.protobuf.performance.cases.Scalars;
+import org.apache.servicecomb.foundation.protobuf.performance.cases.SimpleList;
+
+import com.google.common.base.Strings;
+
+public class TestProtoPerformance {
+  public static void main(String[] args) throws IOException {
+    System.out.println("1.protobuf\n"
+        + "  in our real scenes\n"
+        + "  business model never bind to transport, and can switch between different transports dynamically\n"
+        + "  that means if we choose standard protobuf, must build protobuf models from business models each time\n"
+        + "  so should be much slower than the test results");
+    System.out.println("2.protoStuff\n"
+        + "  some scenes, there is no field but have getter or setter, so we can not use unsafe to access field\n"
+        + "  so we disable protoStuff unsafe feature");
+    System.out.println("3.jackson\n"
+        + "  not support map, so skip map in map/mixed test");
+    System.out.println("4.serialize result size\n"
+        + "  ScbStrong/ScbWeak/Protobuf have the same and smaller size, because skip all default/null value");
+    System.setProperty("protostuff.runtime.use_sun_misc_unsafe", "false");
+
+    int count = 50_0000;
+
+    printResult(new Empty().run(count));
+    printResult(new Scalars().run(count));
+    printResult(new SimpleList().run(count));
+    printResult(new PojoList().run(count));
+    printResult(new Map().run(count));
+    printResult(new Mixed().run(count));
+  }
+
+  private static void printResult(TestResult result) {
+    String strFmt = Strings.repeat("%-11s", result.engineResults.size());
+    String numberFmt = Strings.repeat("%-11d", result.engineResults.size());
+
+    System.out.println(result.name + ":");
+    System.out.printf("               " + strFmt + "\n",
+        result.engineResults.stream().map(r -> r.engineName).toArray());
+
+    System.out.printf("ser time(ms)  :" + numberFmt + "\n",
+        result.engineResults.stream().map(r -> r.msSerTime).toArray());
+    System.out.printf("ser len       :" + numberFmt + "\n",
+        result.engineResults.stream().map(r -> r.serBytes.length).toArray());
+
+    System.out.printf("deser time(ms):" + numberFmt + "\n",
+        result.engineResults.stream().map(r -> r.msDeserTime).toArray());
+    System.out.printf("deser-ser len :" + numberFmt + "\n\n",
+        result.engineResults.stream().map(r -> r.deserResultBytes.length).toArray());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestResult.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestResult.java
new file mode 100644
index 000000000..1c2418215
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/TestResult.java
@@ -0,0 +1,30 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestResult {
+  public String name;
+
+  public List<TestEngineResult> engineResults = new ArrayList<>();
+
+  public void addTestEngineResult(TestEngineResult engineResult) {
+    engineResults.add(engineResult);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Empty.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Empty.java
new file mode 100644
index 000000000..d7846b95d
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Empty.java
@@ -0,0 +1,22 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance.cases;
+
+import org.apache.servicecomb.foundation.protobuf.performance.TestBase;
+
+public class Empty extends TestBase {
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Map.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Map.java
new file mode 100644
index 000000000..6ee1c2f89
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Map.java
@@ -0,0 +1,38 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance.cases;
+
+import java.util.HashMap;
+
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot.User;
+import org.apache.servicecomb.foundation.protobuf.performance.TestBase;
+
+public class Map extends TestBase {
+  public Map() {
+    pojoRoot.setSsMap(new HashMap<>());
+    pojoRoot.getSsMap().put("k1", "v1");
+    pojoRoot.getSsMap().put("k2", "v2");
+    pojoRoot.setSpMap(new HashMap<>());
+    pojoRoot.getSpMap().put("u1", new org.apache.servicecomb.foundation.protobuf.internal.model.User().name("name1"));
+    pojoRoot.getSpMap().put("u2", new org.apache.servicecomb.foundation.protobuf.internal.model.User().name("name2"));
+
+    builder.putSsMap("k1", "v1")
+        .putSsMap("k2", "v2")
+        .putSpMap("u1", User.newBuilder().setName("name1").build())
+        .putSpMap("u2", User.newBuilder().setName("name2").build());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Mixed.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Mixed.java
new file mode 100644
index 000000000..c1a7200e0
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Mixed.java
@@ -0,0 +1,56 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance.cases;
+
+import java.util.Arrays;
+import java.util.HashMap;
+
+import org.apache.servicecomb.foundation.protobuf.internal.model.Color;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot.User;
+import org.apache.servicecomb.foundation.protobuf.performance.TestBase;
+
+public class Mixed extends TestBase {
+  public Mixed() {
+    pojoRoot.setInt32(1);
+    pojoRoot.setInt64(1L);
+    pojoRoot.setString("string value");
+    pojoRoot.setColor(Color.BLUE);
+    pojoRoot.setsList(Arrays.asList("string value1", "string value2"));
+    pojoRoot.setpList(Arrays.asList(
+        new org.apache.servicecomb.foundation.protobuf.internal.model.User().name("name1"),
+        new org.apache.servicecomb.foundation.protobuf.internal.model.User().name("name2")));
+    pojoRoot.setSsMap(new HashMap<>());
+    pojoRoot.getSsMap().put("k1", "v1");
+    pojoRoot.getSsMap().put("k2", "v2");
+    pojoRoot.setSpMap(new HashMap<>());
+    pojoRoot.getSpMap().put("u1", new org.apache.servicecomb.foundation.protobuf.internal.model.User().name("name1"));
+    pojoRoot.getSpMap().put("u2", new org.apache.servicecomb.foundation.protobuf.internal.model.User().name("name2"));
+
+    builder.setInt32(1)
+        .setInt64(1L)
+        .setString("string value")
+        .setColorValue(2)
+        .addSList("string value1")
+        .addSList("string value2")
+        .addPList(User.newBuilder().setName("name1").build())
+        .addPList(User.newBuilder().setName("name2").build())
+        .putSsMap("k1", "v1")
+        .putSsMap("k2", "v2")
+        .putSpMap("u1", User.newBuilder().setName("name1").build())
+        .putSpMap("u2", User.newBuilder().setName("name2").build());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/PojoList.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/PojoList.java
new file mode 100644
index 000000000..eb51199dd
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/PojoList.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.servicecomb.foundation.protobuf.performance.cases;
+
+import java.util.Arrays;
+
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot.User;
+import org.apache.servicecomb.foundation.protobuf.performance.TestBase;
+
+public class PojoList extends TestBase {
+  public PojoList() {
+    pojoRoot.setpList(Arrays.asList(
+        new org.apache.servicecomb.foundation.protobuf.internal.model.User().name("name1"),
+        new org.apache.servicecomb.foundation.protobuf.internal.model.User().name("name2")));
+
+    builder.addPList(User.newBuilder().setName("name1").build())
+        .addPList(User.newBuilder().setName("name2").build());
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Scalars.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Scalars.java
new file mode 100644
index 000000000..1c902a79f
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/Scalars.java
@@ -0,0 +1,34 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance.cases;
+
+import org.apache.servicecomb.foundation.protobuf.internal.model.Color;
+import org.apache.servicecomb.foundation.protobuf.performance.TestBase;
+
+public class Scalars extends TestBase {
+  public Scalars() {
+    pojoRoot.setInt32(1);
+    pojoRoot.setInt64(1L);
+    pojoRoot.setString("string value");
+    pojoRoot.setColor(Color.BLUE);
+
+    builder.setInt32(1)
+        .setInt64(1L)
+        .setString("string value")
+        .setColorValue(2);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/SimpleList.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/SimpleList.java
new file mode 100644
index 000000000..054bc2a59
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/cases/SimpleList.java
@@ -0,0 +1,30 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance.cases;
+
+import java.util.Arrays;
+
+import org.apache.servicecomb.foundation.protobuf.performance.TestBase;
+
+public class SimpleList extends TestBase {
+  public SimpleList() {
+    pojoRoot.setsList(Arrays.asList("string value1", "string value2"));
+
+    builder.addSList("string value1")
+        .addSList("string value2");
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Jackson.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Jackson.java
new file mode 100644
index 000000000..74186fa40
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Jackson.java
@@ -0,0 +1,74 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance.engine;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.apache.servicecomb.foundation.protobuf.internal.model.Root;
+import org.apache.servicecomb.foundation.protobuf.internal.model.User;
+import org.apache.servicecomb.foundation.protobuf.performance.ProtubufCodecEngine;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.dataformat.protobuf.ProtobufMapper;
+import com.fasterxml.jackson.dataformat.protobuf.schema.ProtobufSchema;
+import com.fasterxml.jackson.dataformat.protobuf.schema.ProtobufSchemaLoader;
+
+public class Jackson implements ProtubufCodecEngine {
+  @JsonIgnoreProperties({"ssMap", "spMap", "any", "anys", "typeRecursive"})
+  interface RootMixin {
+  }
+
+  @JsonIgnoreProperties({"typeRecursive"})
+  interface UserMixin {
+  }
+
+  public static ObjectMapper jsonMapper = new ObjectMapper();
+
+  static ProtobufMapper protobufMapper = new ProtobufMapper();
+
+  static URL url = Jackson.class.getClassLoader().getResource("jacksonRoot.proto");
+
+  static ProtobufSchema protobufSchema;
+
+  static {
+    protobufMapper.addMixIn(Root.class, RootMixin.class);
+    protobufMapper.addMixIn(User.class, UserMixin.class);
+    try {
+      protobufSchema = ProtobufSchemaLoader.std.load(url);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  static ObjectWriter writer = protobufMapper.writer(protobufSchema);
+
+  static ObjectReader reader = protobufMapper.reader(protobufSchema).forType(Root.class);
+
+  @Override
+  public byte[] serialize(Object model) throws IOException {
+    return writer.writeValueAsBytes(model);
+  }
+
+  @Override
+  public Object deserialize(byte[] bytes) throws IOException {
+    return reader.readValue(bytes);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Protobuf.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Protobuf.java
new file mode 100644
index 000000000..fe1be8cd6
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Protobuf.java
@@ -0,0 +1,38 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance.engine;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot.Root;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot.Root.Builder;
+import org.apache.servicecomb.foundation.protobuf.performance.ProtubufCodecEngine;
+
+public class Protobuf implements ProtubufCodecEngine {
+  @Override
+  public byte[] serialize(Object builder) {
+    return ((Builder) builder).build().toByteArray();
+  }
+
+  @Override
+  public Object deserialize(byte[] bytes) throws IOException {
+    Root.Builder builder = ProtobufRoot.Root.newBuilder().mergeFrom(bytes);
+    builder.build();
+    return builder;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Protostuff.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Protostuff.java
new file mode 100644
index 000000000..5377f6f8d
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/Protostuff.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.servicecomb.foundation.protobuf.performance.engine;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.internal.model.Root;
+import org.apache.servicecomb.foundation.protobuf.performance.ProtubufCodecEngine;
+
+import io.protostuff.ByteArrayInput;
+import io.protostuff.Input;
+import io.protostuff.LinkedBuffer;
+import io.protostuff.ProtobufOutput;
+import io.protostuff.Schema;
+import io.protostuff.runtime.RuntimeSchema;
+
+public class Protostuff implements ProtubufCodecEngine {
+  static Schema<Root> rootSchema = RuntimeSchema.createFrom(Root.class);
+
+  @Override
+  public byte[] serialize(Object model) throws IOException {
+    LinkedBuffer linkedBuffer = LinkedBuffer.allocate();
+    ProtobufOutput output = new ProtobufOutput(linkedBuffer);
+    rootSchema.writeTo(output, (Root) model);
+    return output.toByteArray();
+  }
+
+  @Override
+  public Object deserialize(byte[] bytes) throws IOException {
+    Input input = new ByteArrayInput(bytes, false);
+    Root result = new Root();
+    rootSchema.mergeFrom(input, result);
+    return result;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/SCB.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/SCB.java
new file mode 100644
index 000000000..945112fdc
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/SCB.java
@@ -0,0 +1,37 @@
+/*
+ * 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.servicecomb.foundation.protobuf.performance.engine;
+
+import java.util.Map;
+
+import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
+import org.apache.servicecomb.foundation.protobuf.ProtoMapperFactory;
+import org.apache.servicecomb.foundation.protobuf.RootDeserializer;
+import org.apache.servicecomb.foundation.protobuf.RootSerializer;
+import org.apache.servicecomb.foundation.protobuf.internal.model.Root;
+
+public class SCB {
+  static ProtoMapperFactory factory = new ProtoMapperFactory();
+
+  static ProtoMapper protoMapper = factory.createFromName("protobufRoot.proto");
+
+  static RootSerializer serializer = protoMapper.findRootSerializer("Root");
+
+  static RootDeserializer deserializer = protoMapper.createRootDeserializer(Root.class, "Root");
+
+  static RootDeserializer mapDeserializer = protoMapper.createRootDeserializer(Map.class, "Root");
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/ScbStrong.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/ScbStrong.java
new file mode 100644
index 000000000..6f021b059
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/ScbStrong.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.servicecomb.foundation.protobuf.performance.engine;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.performance.ProtubufCodecEngine;
+
+public class ScbStrong implements ProtubufCodecEngine {
+  @Override
+  public byte[] serialize(Object model) throws IOException {
+    return SCB.serializer.serialize(model);
+  }
+
+  @Override
+  public Object deserialize(byte[] bytes) throws IOException {
+    return SCB.deserializer.deserialize(bytes);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/ScbWeak.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/ScbWeak.java
new file mode 100644
index 000000000..285bedc00
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/performance/engine/ScbWeak.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.servicecomb.foundation.protobuf.performance.engine;
+
+import java.io.IOException;
+
+import org.apache.servicecomb.foundation.protobuf.performance.ProtubufCodecEngine;
+
+public class ScbWeak implements ProtubufCodecEngine {
+  @Override
+  public byte[] serialize(Object model) throws IOException {
+    return SCB.serializer.serialize(model);
+  }
+
+  @Override
+  public Object deserialize(byte[] bytes) throws IOException {
+    return SCB.mapDeserializer.deserialize(bytes);
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/resources/jacksonRoot.proto b/foundations/foundation-protobuf/src/test/resources/jacksonRoot.proto
new file mode 100644
index 000000000..590402fdb
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/resources/jacksonRoot.proto
@@ -0,0 +1,52 @@
+/*
+  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.
+ */
+
+syntax = "proto2";
+package org.apache.servicecomb.foundation.protobuf.internal.model;
+
+message Root {
+  optional int32 int32 = 1;
+  optional int64 int64 = 2;
+  optional uint32 uint32 = 3;
+  optional uint64 uint64 = 4;
+  optional sint32 sint32 = 5;
+  optional sint64 sint64 = 6;
+  optional fixed32 fixed32 = 7;
+  optional fixed64 fixed64 = 8;
+  optional sfixed32 sfixed32 = 9;
+  optional sfixed64 sfixed64 = 10;
+  optional float floatValue = 11;
+  optional double doubleValue = 12;
+  optional bool bool = 13;
+  optional string string = 14;
+  optional bytes bytes = 15;
+  optional Color color = 16;
+
+  optional User user = 17;
+
+  repeated string sList = 20;
+  repeated User pList = 21;
+}
+enum Color {
+  RED = 0;
+  YELLOW = 1;
+  BLUE = 2;
+}
+
+message User {
+  optional string name = 1;
+}
\ No newline at end of file
diff --git a/foundations/foundation-protobuf/src/test/resources/protobufRoot.proto b/foundations/foundation-protobuf/src/test/resources/protobufRoot.proto
index ae7ad3ae4..3cc857063 100644
--- a/foundations/foundation-protobuf/src/test/resources/protobufRoot.proto
+++ b/foundations/foundation-protobuf/src/test/resources/protobufRoot.proto
@@ -46,8 +46,9 @@ message Root {
   repeated User pList = 21;
 
   google.protobuf.Any any = 22;
+  repeated google.protobuf.Any anys = 23;
 
-  Root typeRecursive = 23;
+  Root typeRecursive = 24;
 }
 enum Color {
   RED = 0;
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxTLSBuilder.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxTLSBuilder.java
index ddc470989..790c7640b 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxTLSBuilder.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxTLSBuilder.java
@@ -20,7 +20,6 @@
 import java.io.File;
 import java.util.Arrays;
 import java.util.HashSet;
-import java.util.Set;
 
 import org.apache.servicecomb.foundation.ssl.SSLCustom;
 import org.apache.servicecomb.foundation.ssl.SSLManager;
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestDefaultJsonValueJaxrsSchema.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestDefaultJsonValueJaxrsSchema.java
index 1e966a675..44b485eb2 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestDefaultJsonValueJaxrsSchema.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestDefaultJsonValueJaxrsSchema.java
@@ -43,6 +43,7 @@ public void invokeFromEdgeWithQuery() {
     Assert.assertEquals(result, "expected:0:null");
   }
 
+  @SuppressWarnings("unchecked")
   @Test
   public void invokeFromEdgeWithRawJson() {
     HttpHeaders headers = new HttpHeaders();
@@ -50,7 +51,7 @@ public void invokeFromEdgeWithRawJson() {
     Map<String, Object> body = new HashMap<>();
     body.put("type", 100);
     HttpEntity<Map<String, Object>> entity = new HttpEntity<>(body, headers);
-    Map result =
+    Map<String, Object> result =
         client.postForObject("/jsonInput", entity, Map.class);
     Assert.assertEquals(result.get("type"), 100);
     Assert.assertEquals(result.get("message"), "expected:null:null");
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestRequestBodySpringMvcSchema.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestRequestBodySpringMvcSchema.java
index ac292b2a4..f630611fd 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestRequestBodySpringMvcSchema.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestRequestBodySpringMvcSchema.java
@@ -54,7 +54,8 @@ private void testDefaultForPremitiveImpl() {
     request.put("extendedMessage", "hi");
 
     HttpEntity<Map<String, Object>> entity = new HttpEntity<>(request, headers);
-    Map result =
+    @SuppressWarnings("unchecked")
+    Map<String, Object> result =
         edgeClient.postForObject("/base", entity, Map.class);
     Assert.assertEquals(result.size(), 6);
     Assert.assertEquals(result.get("type"), 0);
@@ -77,7 +78,8 @@ private void basicRequestResponseImpl() {
     request.put("extendedMessage", "hi");
 
     HttpEntity<Map<String, Object>> entity = new HttpEntity<>(request, headers);
-    Map result =
+    @SuppressWarnings("unchecked")
+    Map<String, Object> result =
         edgeClient.postForObject("/base", entity, Map.class);
     Assert.assertEquals(result.size(), request.size());
     Assert.assertEquals(result.get("type"), request.get("type"));
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/base/TestDownload.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/base/TestDownload.java
index b84c0a4f3..1c6588d06 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/base/TestDownload.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/base/TestDownload.java
@@ -16,14 +16,12 @@
  */
 package org.apache.servicecomb.it.testcase.base;
 
-import org.apache.servicecomb.it.testcase.support.DownloadSchemaIntf;
-import org.apache.servicecomb.provider.pojo.Invoker;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class TestDownload {
-  private static DownloadSchemaIntf intf = Invoker
-      .createProxy("it-producer", "download", DownloadSchemaIntf.class);
+  //  private static DownloadSchemaIntf intf = Invoker
+  //      .createProxy("it-producer", "download", DownloadSchemaIntf.class);
 
   static int x;
 
diff --git a/integration-tests/it-producer-deploy-springboot2-servlet/pom.xml b/integration-tests/it-producer-deploy-springboot2-servlet/pom.xml
index 1cdac736e..b108822da 100644
--- a/integration-tests/it-producer-deploy-springboot2-servlet/pom.xml
+++ b/integration-tests/it-producer-deploy-springboot2-servlet/pom.xml
@@ -16,8 +16,7 @@
   ~ limitations under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<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>
 
@@ -49,6 +48,24 @@
     </dependency>
   </dependencies>
 
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.1</version>
+          <configuration>
+            <compilerArgument>-parameters</compilerArgument>
+            <encoding>UTF-8</encoding>
+            <source>1.8</source>
+            <target>1.8</target>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
   <properties>
     <it.main>org.apache.servicecomb.it.SpringBoot2ServletApplication</it.main>
   </properties>
diff --git a/integration-tests/it-producer-deploy-springboot2-standalone/pom.xml b/integration-tests/it-producer-deploy-springboot2-standalone/pom.xml
index ae9b4179f..0a3ea8d8c 100644
--- a/integration-tests/it-producer-deploy-springboot2-standalone/pom.xml
+++ b/integration-tests/it-producer-deploy-springboot2-standalone/pom.xml
@@ -16,8 +16,7 @@
   ~ limitations under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<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>
 
@@ -49,6 +48,24 @@
     </dependency>
   </dependencies>
 
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.1</version>
+          <configuration>
+            <compilerArgument>-parameters</compilerArgument>
+            <encoding>UTF-8</encoding>
+            <source>1.8</source>
+            <target>1.8</target>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
   <properties>
     <it.main>org.apache.servicecomb.it.SpringBoot2StandaloneApplication</it.main>
   </properties>
diff --git a/java-chassis-dependencies-springboot2/pom.xml b/java-chassis-dependencies-springboot2/pom.xml
index 2033c0704..8f4884d64 100644
--- a/java-chassis-dependencies-springboot2/pom.xml
+++ b/java-chassis-dependencies-springboot2/pom.xml
@@ -16,8 +16,7 @@
   ~ limitations under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<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">
   <parent>
     <artifactId>java-chassis</artifactId>
@@ -32,6 +31,12 @@
   <packaging>pom</packaging>
 
   <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <java.version>1.8</java.version>
+
+    <argLine>-Dfile.encoding=UTF-8</argLine>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
     <spring.version>5.0.4.RELEASE</spring.version>
     <spring.boot.version>2.0.0.RELEASE</spring.boot.version>
     <spring.data.version>2.0.5.RELEASE</spring.data.version>
@@ -170,4 +175,36 @@
     </dependencies>
   </dependencyManagement>
 
+  <build>
+    <pluginManagement>
+      <plugins>
+        <!-- Fixed the m2e warning of remote resources plugin -->
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-remote-resources-plugin</artifactId>
+                    <versionRange>[1.0,)</versionRange>
+                    <goals>
+                      <goal>process</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore>
+                    </ignore>
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
 </project>
\ No newline at end of file
diff --git a/spring-boot2-starter-parent/pom.xml b/spring-boot2-starter-parent/pom.xml
index 036ad3e84..ab0104d40 100644
--- a/spring-boot2-starter-parent/pom.xml
+++ b/spring-boot2-starter-parent/pom.xml
@@ -29,7 +29,6 @@
 
   <artifactId>spring-boot2-starter-parent</artifactId>
   <packaging>pom</packaging>
-  <version>1.1.0-SNAPSHOT</version>
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services