In TinkerPop, the client request - response path is:    client-req  -->   
server-generateResponse  --> server-response-serializer --> 
client-response-deserializer -> client-respone-ogm

Two key steps:
1. server-generateResponse:   
    TinkerPop server could  generate results with: ReferenceVertex, 
ReferenceEdge in most scenarios to reduce network package size and reduce 
seralizer-deseralizer time,  this works well。
    But in very limited scenarios like people themselves know the result set is 
few enough (or by limit step) and  people need DetachedVertex, 
DetachedEdge,..., to get all information in a driect way。
      TinkerPop also provide DetachedFactory to detach any result XXX into 
detachedXXX, this is good and the Tinkerpop server could generate DetachedXXX 
in response easily。

2. server-response-serializer / client-response-deserializer: 
     For GraphSONMessageSerializerV3d0,  If server-generateResponse  return 
ReferenceVertex,  client will get DetachedVertex but properties will be set 
null;If server-generateResponse  
          return DetachedVertex,  client will get DetachedVertex with 
properties will not be null。it seem ok and I think This model works well: 
TinkerPop Server decide if return ReferenceXXX or
          DetachedXXX。serializer / deserializer just transfer the result, 
Serializer / deserializer should not interfere the server of how the response 
format should be which will make the system complex。

     But For GraphBinaryMessageSerializerV1, the upper constraint is 
destroyed。Even  server-generateResponse generate DetachedVertex the client will 
get ReferenceVertex eventually 。 
     I do not think this is a good choice。It will make TinkerPop server unable 
to control client’s experience. to cover this problem, TinkerPop server 
provider should extend Serializer by the following code:
   
writer = new GraphBinaryWriter(TypeSerializerRegistry.build()
        .addCustomType(DetachedVertex.class, new DetachedVertexSerializer())
        .addCustomType(DetachedEdge.class, new DetachedEdgeSerializer())
        .addCustomType(DetachedPath.class, new DetachedPathSerializer())
        .create());

reader = new GraphBinaryReader(TypeSerializerRegistry.build()
        .addCustomType(DetachedVertex.class, new DetachedVertexSerializer())
        .addCustomType(DetachedEdge.class, new DetachedEdgeSerializer())
        .addCustomType(DetachedPath.class, new DetachedPathSerializer())
        .create());

   This need reconstruct  gremlin-driver which will be incompatible with the 
standard gremlin-driver and will take Inconvenience to users;

   So I think we should take careful consideration with properties as the 
annotations have already been mentioned, and judge Vertex  type when writeValue 
to determine if write properties ?
protected Vertex readValue(final ByteBuf buffer, final GraphBinaryReader 
context) throws SerializationException {
    final Vertex v = new ReferenceVertex(context.read(buffer), 
                                         context.readValue(buffer, 
String.class, false));
    
    // discard the properties - as we only send "references" this should always 
be null, but will we change our
    // minds some day????
    context.read(buffer);
    return v;
}
@Override
protected void writeValue(final Vertex value, final ByteBuf buffer, final 
GraphBinaryWriter context) throws SerializationException {
    context.write(value <http://value.id/>. <http://value.id/>id 
<http://value.id/>(), buffer);
    context.writeValue(value.label(), buffer, false);
    context.write(null, buffer);
}

Any comments are very welcome, Thanks!

Reply via email to