diff options
author | Tatu <tatu@ning.com> | 2012-02-07 19:47:33 -0800 |
---|---|---|
committer | Tatu <tatu@ning.com> | 2012-02-07 19:47:33 -0800 |
commit | 58077e9d135f0285a361a1d89b3767c5ece0095a (patch) | |
tree | 417252fa670e39ac280c93811755d40d20d7cb1b /src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java | |
parent | d453182b63249c2c597a54229a4242e1ce1921d0 (diff) | |
download | jackson-databind-58077e9d135f0285a361a1d89b3767c5ece0095a.tar.gz |
Ok, Object Id handling back to working as good as before refactoring, i.e. just for serialization...
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java')
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java index 6b2db52a2..bc32a4984 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java @@ -2,9 +2,11 @@ package com.fasterxml.jackson.databind.ser; import java.io.IOException; +import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.ser.impl.ObjectIdWriter; import com.fasterxml.jackson.databind.ser.impl.UnwrappingBeanSerializer; import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase; import com.fasterxml.jackson.databind.util.NameTransformer; @@ -40,15 +42,7 @@ public class BeanSerializer { super(type, builder, properties, filteredProperties); } - - /** - * Copy-constructor that is useful for sub-classes that just want to - * copy all super-class properties without modifications. - */ - protected BeanSerializer(BeanSerializer src) { - super(src); - } - + /** * Alternate copy constructor that can be used to construct * standard {@link BeanSerializer} passing an instance of @@ -57,6 +51,10 @@ public class BeanSerializer protected BeanSerializer(BeanSerializerBase src) { super(src); } + + protected BeanSerializer(BeanSerializerBase src, ObjectIdWriter objectIdWriter) { + super(src, objectIdWriter); + } /* /********************************************************** @@ -77,6 +75,11 @@ public class BeanSerializer public JsonSerializer<Object> unwrappingSerializer(NameTransformer unwrapper) { return new UnwrappingBeanSerializer(this, unwrapper); } + + @Override + protected BeanSerializer withObjectIdWriter(ObjectIdWriter objectIdWriter) { + return new BeanSerializer(this, objectIdWriter); + } /* /********************************************************** @@ -93,7 +96,7 @@ public class BeanSerializer public final void serialize(Object bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { - if (_objectIdHandler != null) { + if (_objectIdWriter != null) { serializeWithObjectId(bean, jgen, provider); return; } @@ -109,19 +112,25 @@ public class BeanSerializer private final void serializeWithObjectId(Object bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { + final ObjectIdWriter w = _objectIdWriter; // Ok: if we have seen this POJO before, just write the reference: - if (_objectIdHandler.handleReference(bean, jgen, provider)) { - return; - } - // If not, need to inject the id: - jgen.writeStartObject(); - _objectIdHandler.writeAsProperty(bean, jgen, provider); - if (_propertyFilterId != null) { - serializeFieldsFiltered(bean, jgen, provider); - } else { - serializeFields(bean, jgen, provider); + ObjectIdGenerator<?> gen = provider.objectIdsFor(_objectIdWriter.generator); + Object id = gen.findId(bean); + if (id == null) { // first time around: must generate + id = gen.generateId(bean); + // If not, need to inject the id: + jgen.writeStartObject(); + jgen.writeFieldName(w.propertyName); + w.serializer.serialize(id, jgen, provider); + if (_propertyFilterId != null) { + serializeFieldsFiltered(bean, jgen, provider); + } else { + serializeFields(bean, jgen, provider); + } + jgen.writeEndObject(); + } else { // already generated; use one we have + w.serializer.serialize(id, jgen, provider); } - jgen.writeEndObject(); } /* |