Re: CustomId serialization
Ok, ah well I briefly searched for "@class" magic and did not find it. I find Jackson's docs surprisingly bad. Anyway no matter, it works for now. Thanks Pieter On 25/06/2018 18:48, Stephen Mallette wrote: I think - "think" being the key word - that Jackson parses that CLASS to determine the deserializer to use and then hands your deserializer the contents of the rest of the JSON (which is all the deserializers needs once the right one is chosen). On Mon, Jun 25, 2018 at 8:08 AM pieter gmail wrote: Hi, Just manage to get it to work, but not really sure whats going on. So Sqlg's RecordId itself consist of a SchemaTable and a Long. Both RecordId and SchemaTable has serialization code. The part I don't quite get is that serializeWithType and deserialize is not symmetrical. Here is RecordId's serialization code. @Override public void serializeWithType(final RecordId recordId, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException, JsonProcessingException { jsonGenerator.writeStartObject(); jsonGenerator.writeStringField(GraphSONTokens.CLASS, RecordId.class.getName()); jsonGenerator.writeObjectField("schemaTable", recordId.getSchemaTable()); jsonGenerator.writeNumberField("id", recordId.getId()); jsonGenerator.writeEndObject(); } @Override public RecordId deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { org.apache.tinkerpop.shaded.jackson.core.JsonToken jsonToken = jsonParser.nextToken(); Preconditions.checkState(JsonToken.START_OBJECT == jsonToken); SchemaTable schemaTable = deserializationContext.readValue(jsonParser, SchemaTable.class); jsonToken = jsonParser.nextToken(); Preconditions.checkState(org.apache.tinkerpop.shaded.jackson.core.JsonToken.FIELD_NAME == jsonToken); Preconditions.checkState("id".equals(jsonParser.getValueAsString())); jsonToken = jsonParser.nextToken(); Preconditions.checkState(JsonToken.VALUE_NUMBER_INT == jsonToken); long id = jsonParser.getValueAsLong(); jsonToken = jsonParser.nextToken(); Preconditions.checkState(org.apache.tinkerpop.shaded.jackson.core.JsonToken.END_OBJECT == jsonToken); return RecordId.from(schemaTable, id); } What happened to the GraphSONTokens.CLASS ? I was expecting to have to read that also but somewhere I have lost the flow. Just to reiterate it is working now and all the tests are passing, so its more of a information question. Thanks Pieter On 25/06/2018 13:38, Stephen Mallette wrote: I would think that you could write your own custom deserializer if you needed to. That error doesn't give me any hints as to what might be wrong exactly. I can't think of why that wouldn't work, but even with a little refresh by looking at the code just now, my memory on GraphSON 1.0 is fuzzy. Maybe you could try to modify the working test in TinkerPop to include a deserializer and see if you get a similar error for your efforts? Perhaps that would help yield a clue? On Mon, Jun 25, 2018 at 2:58 AM pieter gmail wrote: Hi, I am trying to upgrade Sqlg to 3.3.3 from 3.3.1. The only tests that are failing are the io tests for graphson V1. I see CustomId has a CustomIdJacksonSerializerV1d0 but not a deserializer. Looks like Jackson is using reflection to instantiate the CustomId and set its cluster and elementId. Is this how it must be or can it work with a deserializer? Sqlg's RecordId does not have default constructors. For Sqlg I added the standard deserializer but it fails with. org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'org.umlg.sqlg.structure.SchemaTable' as a subtype of [map type; class java.util.LinkedHashMap, [simple type, class java.lang.Object] -> [simple type, class java.lang.Object]]: Not a subtype at [Source: (ByteArrayInputStream); line: 1, column: 105] (through reference chain: java.util.HashMap["id"]) at org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) at org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.invalidTypeIdException(DeserializationContext.java:1628) at org.apache.tinkerpop.shaded.jackson.databind.DatabindContext.resolveSubType(DatabindContext.java:200) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:49) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:44) at
Re: CustomId serialization
I think - "think" being the key word - that Jackson parses that CLASS to determine the deserializer to use and then hands your deserializer the contents of the rest of the JSON (which is all the deserializers needs once the right one is chosen). On Mon, Jun 25, 2018 at 8:08 AM pieter gmail wrote: > Hi, > > Just manage to get it to work, but not really sure whats going on. > > So Sqlg's RecordId itself consist of a SchemaTable and a Long. Both > RecordId and SchemaTable has serialization code. > > The part I don't quite get is that serializeWithType and deserialize is > not symmetrical. > Here is RecordId's serialization code. > > @Override > public void serializeWithType(final RecordId recordId, final > JsonGenerator jsonGenerator, >final SerializerProvider > serializerProvider, final TypeSerializer typeSerializer) throws > IOException, JsonProcessingException { > > jsonGenerator.writeStartObject(); > jsonGenerator.writeStringField(GraphSONTokens.CLASS, > RecordId.class.getName()); > jsonGenerator.writeObjectField("schemaTable", > recordId.getSchemaTable()); > jsonGenerator.writeNumberField("id", recordId.getId()); > jsonGenerator.writeEndObject(); > } > > @Override > public RecordId deserialize(final JsonParser jsonParser, final > DeserializationContext deserializationContext) throws IOException, > JsonProcessingException { > org.apache.tinkerpop.shaded.jackson.core.JsonToken > jsonToken = jsonParser.nextToken(); > Preconditions.checkState(JsonToken.START_OBJECT == jsonToken); > SchemaTable schemaTable = > deserializationContext.readValue(jsonParser, SchemaTable.class); > jsonToken = jsonParser.nextToken(); > Preconditions.checkState(org.apache.tinkerpop.shaded.jackson.core.JsonToken.FIELD_NAME > > == jsonToken); > Preconditions.checkState("id".equals(jsonParser.getValueAsString())); > jsonToken = jsonParser.nextToken(); > Preconditions.checkState(JsonToken.VALUE_NUMBER_INT == > jsonToken); > long id = jsonParser.getValueAsLong(); > jsonToken = jsonParser.nextToken(); > Preconditions.checkState(org.apache.tinkerpop.shaded.jackson.core.JsonToken.END_OBJECT > > == jsonToken); > return RecordId.from(schemaTable, id); > } > > What happened to the GraphSONTokens.CLASS ? > I was expecting to have to read that also but somewhere I have lost the > flow. > > Just to reiterate it is working now and all the tests are passing, so > its more of a information question. > > Thanks > Pieter > > > On 25/06/2018 13:38, Stephen Mallette wrote: > > I would think that you could write your own custom deserializer if you > > needed to. That error doesn't give me any hints as to what might be wrong > > exactly. I can't think of why that wouldn't work, but even with a little > > refresh by looking at the code just now, my memory on GraphSON 1.0 is > fuzzy. > > > > Maybe you could try to modify the working test in TinkerPop to include a > > deserializer and see if you get a similar error for your efforts? Perhaps > > that would help yield a clue? > > > > On Mon, Jun 25, 2018 at 2:58 AM pieter gmail > > wrote: > > > >> Hi, > >> > >> I am trying to upgrade Sqlg to 3.3.3 from 3.3.1. > >> > >> The only tests that are failing are the io tests for graphson V1. > >> > >> I see CustomId has a CustomIdJacksonSerializerV1d0 but not a > >> deserializer. Looks like Jackson is using reflection to instantiate the > >> CustomId and set its cluster and elementId. > >> Is this how it must be or can it work with a deserializer? Sqlg's > >> RecordId does not have default constructors. > >> > >> For Sqlg I added the standard deserializer but it fails with. > >> > >> org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException: > >> Could not resolve type id 'org.umlg.sqlg.structure.SchemaTable' as a > >> subtype of [map type; class java.util.LinkedHashMap, [simple type, class > >> java.lang.Object] -> [simple type, class java.lang.Object]]: Not a > subtype > >>at [Source: (ByteArrayInputStream); line: 1, column: 105] (through > >> reference chain: java.util.HashMap["id"]) > >> > >> at > >> > >> > org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) > >> at > >> > >> > org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.invalidTypeIdException(DeserializationContext.java:1628) > >> at > >> > >> > org.apache.tinkerpop.shaded.jackson.databind.DatabindContext.resolveSubType(DatabindContext.java:200) > >> at > >> > >> > org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:49) > >> at > >> > >> > org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:44) > >>
Re: CustomId serialization
Hi, Just manage to get it to work, but not really sure whats going on. So Sqlg's RecordId itself consist of a SchemaTable and a Long. Both RecordId and SchemaTable has serialization code. The part I don't quite get is that serializeWithType and deserialize is not symmetrical. Here is RecordId's serialization code. @Override public void serializeWithType(final RecordId recordId, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException, JsonProcessingException { jsonGenerator.writeStartObject(); jsonGenerator.writeStringField(GraphSONTokens.CLASS, RecordId.class.getName()); jsonGenerator.writeObjectField("schemaTable", recordId.getSchemaTable()); jsonGenerator.writeNumberField("id", recordId.getId()); jsonGenerator.writeEndObject(); } @Override public RecordId deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { org.apache.tinkerpop.shaded.jackson.core.JsonToken jsonToken = jsonParser.nextToken(); Preconditions.checkState(JsonToken.START_OBJECT == jsonToken); SchemaTable schemaTable = deserializationContext.readValue(jsonParser, SchemaTable.class); jsonToken = jsonParser.nextToken(); Preconditions.checkState(org.apache.tinkerpop.shaded.jackson.core.JsonToken.FIELD_NAME == jsonToken); Preconditions.checkState("id".equals(jsonParser.getValueAsString())); jsonToken = jsonParser.nextToken(); Preconditions.checkState(JsonToken.VALUE_NUMBER_INT == jsonToken); long id = jsonParser.getValueAsLong(); jsonToken = jsonParser.nextToken(); Preconditions.checkState(org.apache.tinkerpop.shaded.jackson.core.JsonToken.END_OBJECT == jsonToken); return RecordId.from(schemaTable, id); } What happened to the GraphSONTokens.CLASS ? I was expecting to have to read that also but somewhere I have lost the flow. Just to reiterate it is working now and all the tests are passing, so its more of a information question. Thanks Pieter On 25/06/2018 13:38, Stephen Mallette wrote: I would think that you could write your own custom deserializer if you needed to. That error doesn't give me any hints as to what might be wrong exactly. I can't think of why that wouldn't work, but even with a little refresh by looking at the code just now, my memory on GraphSON 1.0 is fuzzy. Maybe you could try to modify the working test in TinkerPop to include a deserializer and see if you get a similar error for your efforts? Perhaps that would help yield a clue? On Mon, Jun 25, 2018 at 2:58 AM pieter gmail wrote: Hi, I am trying to upgrade Sqlg to 3.3.3 from 3.3.1. The only tests that are failing are the io tests for graphson V1. I see CustomId has a CustomIdJacksonSerializerV1d0 but not a deserializer. Looks like Jackson is using reflection to instantiate the CustomId and set its cluster and elementId. Is this how it must be or can it work with a deserializer? Sqlg's RecordId does not have default constructors. For Sqlg I added the standard deserializer but it fails with. org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'org.umlg.sqlg.structure.SchemaTable' as a subtype of [map type; class java.util.LinkedHashMap, [simple type, class java.lang.Object] -> [simple type, class java.lang.Object]]: Not a subtype at [Source: (ByteArrayInputStream); line: 1, column: 105] (through reference chain: java.util.HashMap["id"]) at org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) at org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.invalidTypeIdException(DeserializationContext.java:1628) at org.apache.tinkerpop.shaded.jackson.databind.DatabindContext.resolveSubType(DatabindContext.java:200) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:49) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:44) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:156) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97) at org.apache.tinkerpop.shaded.jackson.databind.deser.std.MapDeserializer.deserializeWithType(MapDeserializer.java:400) at
Re: CustomId serialization
I would think that you could write your own custom deserializer if you needed to. That error doesn't give me any hints as to what might be wrong exactly. I can't think of why that wouldn't work, but even with a little refresh by looking at the code just now, my memory on GraphSON 1.0 is fuzzy. Maybe you could try to modify the working test in TinkerPop to include a deserializer and see if you get a similar error for your efforts? Perhaps that would help yield a clue? On Mon, Jun 25, 2018 at 2:58 AM pieter gmail wrote: > Hi, > > I am trying to upgrade Sqlg to 3.3.3 from 3.3.1. > > The only tests that are failing are the io tests for graphson V1. > > I see CustomId has a CustomIdJacksonSerializerV1d0 but not a > deserializer. Looks like Jackson is using reflection to instantiate the > CustomId and set its cluster and elementId. > Is this how it must be or can it work with a deserializer? Sqlg's > RecordId does not have default constructors. > > For Sqlg I added the standard deserializer but it fails with. > > org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException: > Could not resolve type id 'org.umlg.sqlg.structure.SchemaTable' as a > subtype of [map type; class java.util.LinkedHashMap, [simple type, class > java.lang.Object] -> [simple type, class java.lang.Object]]: Not a subtype > at [Source: (ByteArrayInputStream); line: 1, column: 105] (through > reference chain: java.util.HashMap["id"]) > > at > > org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) > at > > org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.invalidTypeIdException(DeserializationContext.java:1628) > at > > org.apache.tinkerpop.shaded.jackson.databind.DatabindContext.resolveSubType(DatabindContext.java:200) > at > > org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:49) > at > > org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:44) > at > > org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:156) > at > > org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113) > at > > org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97) > at > > org.apache.tinkerpop.shaded.jackson.databind.deser.std.MapDeserializer.deserializeWithType(MapDeserializer.java:400) > at > > org.apache.tinkerpop.shaded.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:68) > at > > org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.readValue(DeserializationContext.java:759) > at > > org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.readValue(DeserializationContext.java:746) > at > > org.umlg.sqlg.structure.RecordId$RecordIdJacksonDeserializerV1d0.deserialize(RecordId.java:205) > > Any ideas as to how I should implement this? > > Thanks > Pieter > > > >
RE: CustomId serialization
Hi, I am trying to upgrade Sqlg to 3.3.3 from 3.3.1. The only tests that are failing are the io tests for graphson V1. I see CustomId has a CustomIdJacksonSerializerV1d0 but not a deserializer. Looks like Jackson is using reflection to instantiate the CustomId and set its cluster and elementId. Is this how it must be or can it work with a deserializer? Sqlg's RecordId does not have default constructors. For Sqlg I added the standard deserializer but it fails with. org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'org.umlg.sqlg.structure.SchemaTable' as a subtype of [map type; class java.util.LinkedHashMap, [simple type, class java.lang.Object] -> [simple type, class java.lang.Object]]: Not a subtype at [Source: (ByteArrayInputStream); line: 1, column: 105] (through reference chain: java.util.HashMap["id"]) at org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) at org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.invalidTypeIdException(DeserializationContext.java:1628) at org.apache.tinkerpop.shaded.jackson.databind.DatabindContext.resolveSubType(DatabindContext.java:200) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:49) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:44) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:156) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113) at org.apache.tinkerpop.shaded.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97) at org.apache.tinkerpop.shaded.jackson.databind.deser.std.MapDeserializer.deserializeWithType(MapDeserializer.java:400) at org.apache.tinkerpop.shaded.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:68) at org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.readValue(DeserializationContext.java:759) at org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.readValue(DeserializationContext.java:746) at org.umlg.sqlg.structure.RecordId$RecordIdJacksonDeserializerV1d0.deserialize(RecordId.java:205) Any ideas as to how I should implement this? Thanks Pieter