Class TaggedFieldSerializer<T>
- All Implemented Interfaces:
Comparator<FieldSerializer.CachedField>
@Tag(int)
annotation. This provides
backward compatibility so new fields can be added. TaggedFieldSerializer has two advantages over VersionFieldSerializer
: 1) fields can be renamed and 2) fields marked with the @Deprecated
annotation will be ignored when reading old
bytes and won't be written to new bytes. Deprecation effectively removes the field from serialization, though the field and
@Tag
annotation must remain in the class. Deprecated fields can optionally be made private and/or renamed so they
don't clutter the class (eg, ignored
, ignored2
). For these reasons, TaggedFieldSerializer generally
provides more flexibility for classes to evolve. The downside is that it has a small amount of additional overhead compared to
VersionFieldSerializer (an additional varint per field).
Forward compatibility is optionally supported by enabling TaggedFieldSerializerConfig.setSkipUnknownTags(boolean)
,
which allows it to skip reading unknown tagged fields, which are presumably new fields added in future versions of an
application. The data is only forward compatible if the newly added fields are tagged with
TaggedFieldSerializer.Tag.annexed()
set true, which comes with the cost of chunked encoding. When annexed fields are
encountered during the read or write process of an object, a buffer is allocated to perform the chunked encoding.
Tag values must be entirely unique, even among a class and its superclass(es). An IllegalArgumentException will be thrown by
Kryo.register(Class)
(and its overloads) if duplicate Tag values are encountered.
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic @interface
Marks a field for serialization.Nested classes/interfaces inherited from class com.esotericsoftware.kryo.serializers.FieldSerializer
FieldSerializer.Bind, FieldSerializer.CachedField<X>, FieldSerializer.CachedFieldFactory, FieldSerializer.CachedFieldNameStrategy, FieldSerializer.Optional
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate boolean[]
private boolean[]
private static final Comparator
<FieldSerializer.CachedField> private int[]
private int
Fields inherited from class com.esotericsoftware.kryo.serializers.FieldSerializer
access, asmFieldFactory, componentType, config, kryo, objectFieldFactory, removedFields, type, typeParameters
-
Constructor Summary
ConstructorsConstructorDescriptionTaggedFieldSerializer
(Kryo kryo, Class type) TaggedFieldSerializer
(Kryo kryo, Class type, TaggedFieldSerializerConfig config) -
Method Summary
Modifier and TypeMethodDescriptionprotected void
Reads bytes and returns a new object of the specified concrete type.void
Removes a field so that it won't be serialized.void
removeField
(String fieldName) Removes a field so that it won't be serialized.void
This method can be called for different fields having the same type.Methods inherited from class com.esotericsoftware.kryo.serializers.FieldSerializer
compare, copy, create, createCopy, getCachedFieldName, getConfig, getCopyTransient, getField, getFields, getGenerics, getGenericsScope, getKryo, getSerializeTransient, getTransientFields, getType, newCachedField, newMatchingCachedField, rebuildCachedFields, rebuildCachedFields, setCopyTransient, setFieldsAsAccessible, setFieldsCanBeNull, setFixedFieldTypes, setGenerics, setIgnoreSyntheticFields, setOptimizedGenerics, setSerializeTransient
Methods inherited from class com.esotericsoftware.kryo.Serializer
getAcceptsNull, isImmutable, setAcceptsNull, setImmutable
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface java.util.Comparator
equals, reversed, thenComparing, thenComparing, thenComparing, thenComparingDouble, thenComparingInt, thenComparingLong
-
Field Details
-
tags
private int[] tags -
writeFieldCount
private int writeFieldCount -
deprecated
private boolean[] deprecated -
annexed
private boolean[] annexed -
TAGGED_VALUE_COMPARATOR
-
-
Constructor Details
-
TaggedFieldSerializer
-
TaggedFieldSerializer
-
-
Method Details
-
initializeCachedFields
protected void initializeCachedFields()- Overrides:
initializeCachedFields
in classFieldSerializer<T,
TaggedFieldSerializerConfig>
-
removeField
Description copied from class:FieldSerializer
Removes a field so that it won't be serialized.- Overrides:
removeField
in classFieldSerializer<T,
TaggedFieldSerializerConfig>
-
removeField
Description copied from class:FieldSerializer
Removes a field so that it won't be serialized.- Overrides:
removeField
in classFieldSerializer<T,
TaggedFieldSerializerConfig>
-
write
Description copied from class:FieldSerializer
This method can be called for different fields having the same type. Even though the raw type is the same, if the type is generic, it could happen that different concrete classes are used to instantiate it. Therefore, in case of different instantiation parameters, the fields analysis should be repeated. TODO: Cache serializer instances generated for a given set of generic parameters. Reuse it later instead of recomputing every time.- Overrides:
write
in classFieldSerializer<T,
TaggedFieldSerializerConfig> - Parameters:
object
- May be null ifSerializer.getAcceptsNull()
is true.
-
read
Description copied from class:Serializer
Reads bytes and returns a new object of the specified concrete type.Before Kryo can be used to read child objects,
Kryo.reference(Object)
must be called with the parent object to ensure it can be referenced by the child objects. Any serializer that usesKryo
to read a child object may need to be reentrant.This method should not be called directly, instead this serializer can be passed to
Kryo
read methods that accept a serialier.- Overrides:
read
in classFieldSerializer<T,
TaggedFieldSerializerConfig> - Returns:
- May be null if
Serializer.getAcceptsNull()
is true.
-