I also thought about this when I tried to set this serializer up with the php driver. This is quite a breaking change though.
On Thu, Mar 31, 2016 at 1:33 PM, Kevin Gallardo <kevin.galla...@datastax.com > wrote: > Hi, > > > By working closely with Tinkerpop I have been interacting quite a bit with > the GraphSON format and I have come up with the need of using the > "embedTypes" option of the GraphSON Mapper to get more insight of the types > of the data I was transferring through the GraphSON payload. > > By default vertices, edges, having properties that have another type than > the natively supported types in the JSON format are encoded as their String > representation. Meaning that a Vertex property being a UUID will look like > "24B7DED2-F72A-11E5-815D-79DF61FECC63" which, for the user consuming the > JSON produced by the GraphSONWriter, will not be distinguishable from being > a String or a UUID. That is usually why you need to activate the type > embedding of GraphSON. Documentation about the current output of GraphSON > typing : > > http://tinkerpop.apache.org/docs/3.1.1-incubating/reference/#graphson-reader-writer > > However, right now, embedding types with GraphSON comes with a few trade > offs : > > - It is very verbose, mostly because Arrays and Maps types are embedded. > But Arrays and Maps are natively supported in JSON, and other native > types > like Strings or booleans do not appear typed, so these types should > logically also be excluded, since natively supported in JSON. > - It is not consistent, if the type is to be embedded in a JSON Object, > it will come as a JSON Object's element, a key-value pair {"@class" : > "java.util.HashMap", ... }, whereas if the type is to be embedded in a > JSON > Array, it will be embedded in "best-effort" and put as a simple value > that > will be ["java.util.HashMap", ... ], hence it makes it difficult to > automatically parse typed results. > - It is Java centric. > > I'd like to propose a format to encapsulate values format, that would > address the points mentioned above, in which the main idea being that > whenever a type needs to be embedded, the value itself and the type would > be encapsulated in an Array, and the first element is a JSON Object > containing only the key/value pair {"@class": "TypeName"}, the second > element being the value. > > A Short integer value encoded would change from : > > 2 > > *untyped, to : > > [{"@class":"Short"}, 2] > > with the type. > > It's just an example, but I thought this format would be robust enough. And > properties or other elements for which types are natively supported in JSON > would not need the additional metadata about their types, like it is now > with GraphSON. I have a working prototype for this. > > Taking the Tinkerpop's doc example of GraphSON embedded types and applying > the proposed changes : > > ----------------------------- > > { > "@class":"java.util.HashMap", > "id":1, > "label":"person", > "outE":{ > "@class":"java.util.HashMap", > "created":[ > "java.util.ArrayList", > [ > { > "@class":"java.util.HashMap", > "id":9, > "inV":3, > "properties":{ > "@class":"java.util.HashMap", > "weight":0.4 > } > } > ] > ], > "knows":[ > "java.util.ArrayList", > [ > { > "@class":"java.util.HashMap", > "id":7, > "inV":2, > "properties":{ > "@class":"java.util.HashMap", > "weight":0.5 > } > }, > { > "@class":"java.util.HashMap", > "id":8, > "inV":4, > "properties":{ > "@class":"java.util.HashMap", > "weight":1 > } > } > ] > ] > }, > "properties":{ > "@class":"java.util.HashMap", > "name":[ > "java.util.ArrayList", > [ > { > "@class":"java.util.HashMap", > "id":[ > "java.lang.Long", > 0 > ], > "value":"marko" > } > ] > ], > "age":[ > "java.util.ArrayList", > [ > { > "@class":"java.util.HashMap", > "id":[ > "java.lang.Long", > 1 > ], > "value":29 > } > ] > ] > } > } > > > -------------------------------------------------------------- > > With the changes : > > { > "id":1, > "label":"person", > "outE":{ > "created":[ > { > "id":9, > "inV":3, > "properties":{ > "weight":0.4 > } > } > ], > "knows":[ > { > "id":7, > "inV":2, > "properties":{ > "weight":0.5 > } > }, > { > "id":8, > "inV":4, > "properties":{ > "weight":1 > } > } > ] > }, > "properties":{ > "name":[ > { > "id":[ > {"@class":"Long"}, > 0 > ], > "value":"marko" > } > ], > "age":[ > { > "id":[ > {"@class":"Long"}, > 1 > ], > "value":29 > } > ] > } > } > > ---------------------------------------------------- > > Open to suggestions and your feedback. > > > > Cheers! > > -- > Kévin Gallardo. > kgdo.me >