Class FieldSerializer<T,C extends FieldSerializerConfig>
- java.lang.Object
-
- com.esotericsoftware.kryo.Serializer<T>
-
- com.esotericsoftware.kryo.serializers.FieldSerializer<T,C>
-
- All Implemented Interfaces:
java.util.Comparator<FieldSerializer.CachedField>
- Direct Known Subclasses:
CompatibleFieldSerializer,TaggedFieldSerializer,VersionFieldSerializer
public class FieldSerializer<T,C extends FieldSerializerConfig> extends Serializer<T> implements java.util.Comparator<FieldSerializer.CachedField>
Serializes objects using direct field assignment. FieldSerializer is generic and can serialize most classes without any configuration. It is efficient and writes only the field data, without any extra information. It does not support adding, removing, or changing the type of fields without invalidating previously serialized bytes. This can be acceptable in many situations, such as when sending data over a network, but may not be a good choice for long term data storage because the Java classes cannot evolve. Because FieldSerializer attempts to read and write non-public fields by default, it is important to evaluate each class that will be serialized. If fields are public, bytecode generation will be used instead of reflection.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceFieldSerializer.BindUsed to annotate fields with a specific Kryo serializer.static classFieldSerializer.CachedField<X>Controls how a field will be serialized.static interfaceFieldSerializer.CachedFieldFactorystatic interfaceFieldSerializer.CachedFieldNameStrategystatic interfaceFieldSerializer.OptionalIndicates a field should be ignored when its declaring class is registered unless thecontexthas a value set for the specified key.
-
Field Summary
Fields Modifier and Type Field Description (package private) java.lang.Objectaccessprivate FieldSerializerAnnotationsUtilannotationsUtil(package private) static FieldSerializer.CachedFieldFactoryasmFieldFactory(package private) java.lang.ClasscomponentTypeprotected Cconfigprivate FieldSerializer.CachedField[]fieldsprivate java.lang.Class[]genericsConcrete classes passed as values for type variablesprivate GenericsgenericsScopeprivate FieldSerializerGenericsUtilgenericsUtilprivate booleanhasObjectFields(package private) Kryokryo(package private) static FieldSerializer.CachedFieldFactoryobjectFieldFactoryprotected java.util.HashSet<FieldSerializer.CachedField>removedFieldsprivate FieldSerializer.CachedField[]transientFields(package private) java.lang.Classtype(package private) java.lang.reflect.TypeVariable[]typeParameterstype variables declared for this typeprivate booleanvarIntsEnabledIf set, this serializer tries to use a variable length encoding for int and long fields
-
Constructor Summary
Constructors Constructor Description FieldSerializer(Kryo kryo, java.lang.Class type)FieldSerializer(Kryo kryo, java.lang.Class type, java.lang.Class[] generics)FieldSerializer(Kryo kryo, java.lang.Class type, java.lang.Class[] generics, C config)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private java.util.List<java.lang.reflect.Field>buildValidFields(boolean transientFields, java.util.List<java.lang.reflect.Field> allFields, ObjectMap context, IntArray useAsm)private java.util.List<java.lang.reflect.Field>buildValidFieldsFromCachedFields(FieldSerializer.CachedField[] cachedFields, IntArray useAsm)intcompare(FieldSerializer.CachedField o1, FieldSerializer.CachedField o2)Tcopy(Kryo kryo, T original)Returns a copy of the specified object.protected Tcreate(Kryo kryo, Input input, java.lang.Class<T> type)Used byread(Kryo, Input, Class)to create the new object.private voidcreateCachedFields(IntArray useAsm, java.util.List<java.lang.reflect.Field> validFields, java.util.List<FieldSerializer.CachedField> cachedFields, int baseIndex)protected TcreateCopy(Kryo kryo, T original)Used bycopy(Kryo, Object)to create the new object.private FieldSerializer.CachedFieldFactorygetAsmFieldFactory()protected java.lang.StringgetCachedFieldName(FieldSerializer.CachedField cachedField)CgetConfig()booleangetCopyTransient()FieldSerializer.CachedFieldgetField(java.lang.String fieldName)Allows specific fields to be optimized.FieldSerializer.CachedField[]getFields()Get all fields controlled by this FieldSerializerjava.lang.Class[]getGenerics()Get generic type parameters of the class controlled by this serializer.(package private) GenericsgetGenericsScope()KryogetKryo()private FieldSerializer.CachedFieldFactorygetObjectFieldFactory()booleangetSerializeTransient()FieldSerializer.CachedField[]getTransientFields()Get all transient fields controlled by this FieldSerializerjava.lang.ClassgetType()protected voidinitializeCachedFields()(package private) FieldSerializer.CachedFieldnewCachedField(java.lang.reflect.Field field, int fieldIndex, int accessIndex)(package private) FieldSerializer.CachedFieldnewMatchingCachedField(java.lang.reflect.Field field, int accessIndex, java.lang.Class fieldClass, java.lang.reflect.Type fieldGenericType, java.lang.Class[] fieldGenerics)Tread(Kryo kryo, Input input, java.lang.Class<T> type)Reads bytes and returns a new object of the specified concrete type.protected voidrebuildCachedFields()Called when the list of cached fields must be rebuilt.protected voidrebuildCachedFields(boolean minorRebuild)Rebuilds the list of cached fields.voidremoveField(FieldSerializer.CachedField removeField)Removes a field so that it won't be serialized.voidremoveField(java.lang.String fieldName)Removes a field so that it won't be serialized.voidsetCopyTransient(boolean setCopyTransient)voidsetFieldsAsAccessible(boolean setFieldsAsAccessible)Controls which fields are serialized.voidsetFieldsCanBeNull(boolean fieldsCanBeNull)Sets the default value forFieldSerializer.CachedField.setCanBeNull(boolean).voidsetFixedFieldTypes(boolean fixedFieldTypes)Sets the default value forFieldSerializer.CachedField.setClass(Class)to the field's declared type.voidsetGenerics(Kryo kryo, java.lang.Class[] generics)Sets the generic types of the field or method this serializer will be used for on the next call to read or write.voidsetIgnoreSyntheticFields(boolean ignoreSyntheticFields)Controls if synthetic fields are serialized.voidsetOptimizedGenerics(boolean setOptimizedGenerics)Controls if the serialization of generics should be optimized for smaller size.voidsetSerializeTransient(boolean setSerializeTransient)voidwrite(Kryo kryo, Output output, T object)This method can be called for different fields having the same type.-
Methods inherited from class com.esotericsoftware.kryo.Serializer
getAcceptsNull, isImmutable, setAcceptsNull, setImmutable
-
-
-
-
Field Detail
-
kryo
final Kryo kryo
-
type
final java.lang.Class type
-
typeParameters
final java.lang.reflect.TypeVariable[] typeParameters
type variables declared for this type
-
componentType
final java.lang.Class componentType
-
config
protected final C extends FieldSerializerConfig config
-
fields
private FieldSerializer.CachedField[] fields
-
transientFields
private FieldSerializer.CachedField[] transientFields
-
removedFields
protected java.util.HashSet<FieldSerializer.CachedField> removedFields
-
access
java.lang.Object access
-
genericsUtil
private FieldSerializerGenericsUtil genericsUtil
-
annotationsUtil
private FieldSerializerAnnotationsUtil annotationsUtil
-
generics
private java.lang.Class[] generics
Concrete classes passed as values for type variables
-
genericsScope
private Generics genericsScope
-
varIntsEnabled
private boolean varIntsEnabled
If set, this serializer tries to use a variable length encoding for int and long fields
-
hasObjectFields
private boolean hasObjectFields
-
asmFieldFactory
static FieldSerializer.CachedFieldFactory asmFieldFactory
-
objectFieldFactory
static FieldSerializer.CachedFieldFactory objectFieldFactory
-
-
Method Detail
-
rebuildCachedFields
protected void rebuildCachedFields()
Called when the list of cached fields must be rebuilt. This is done any time settings are changed that affect which fields will be used. It is called from the constructor for FieldSerializer, but not for subclasses. Subclasses must call this from their constructor.
-
rebuildCachedFields
protected void rebuildCachedFields(boolean minorRebuild)
Rebuilds the list of cached fields.- Parameters:
minorRebuild- if set, processing due to changes in generic type parameters will be optimized
-
buildValidFieldsFromCachedFields
private java.util.List<java.lang.reflect.Field> buildValidFieldsFromCachedFields(FieldSerializer.CachedField[] cachedFields, IntArray useAsm)
-
buildValidFields
private java.util.List<java.lang.reflect.Field> buildValidFields(boolean transientFields, java.util.List<java.lang.reflect.Field> allFields, ObjectMap context, IntArray useAsm)
-
createCachedFields
private void createCachedFields(IntArray useAsm, java.util.List<java.lang.reflect.Field> validFields, java.util.List<FieldSerializer.CachedField> cachedFields, int baseIndex)
-
setGenerics
public void setGenerics(Kryo kryo, java.lang.Class[] generics)
Description copied from class:SerializerSets the generic types of the field or method this serializer will be used for on the next call to read or write. Subsequent calls to read and write must not use this generic type information. The default implementation does nothing. Subclasses may use the information provided to this method for more efficient serialization, eg to use the same type for all items in a list.- Overrides:
setGenericsin classSerializer<T>generics- Some (but never all) elements may be null if there is no generic type information at that index.
-
getGenerics
public java.lang.Class[] getGenerics()
Get generic type parameters of the class controlled by this serializer.- Returns:
- generic type parameters or null, if there are none.
-
initializeCachedFields
protected void initializeCachedFields()
-
newCachedField
FieldSerializer.CachedField newCachedField(java.lang.reflect.Field field, int fieldIndex, int accessIndex)
-
newMatchingCachedField
FieldSerializer.CachedField newMatchingCachedField(java.lang.reflect.Field field, int accessIndex, java.lang.Class fieldClass, java.lang.reflect.Type fieldGenericType, java.lang.Class[] fieldGenerics)
-
getAsmFieldFactory
private FieldSerializer.CachedFieldFactory getAsmFieldFactory()
-
getObjectFieldFactory
private FieldSerializer.CachedFieldFactory getObjectFieldFactory()
-
compare
public int compare(FieldSerializer.CachedField o1, FieldSerializer.CachedField o2)
- Specified by:
comparein interfacejava.util.Comparator<T>
-
setFieldsCanBeNull
public void setFieldsCanBeNull(boolean fieldsCanBeNull)
Sets the default value forFieldSerializer.CachedField.setCanBeNull(boolean). Calling this method resets thecached fields.- Parameters:
fieldsCanBeNull- False if none of the fields are null. Saves 0-1 byte per field. True if it is not known (default).
-
setFieldsAsAccessible
public void setFieldsAsAccessible(boolean setFieldsAsAccessible)
Controls which fields are serialized. Calling this method resets thecached fields.- Parameters:
setFieldsAsAccessible- If true, all non-transient fields (inlcuding private fields) will be serialized andset as accessibleif necessary (default). If false, only fields in the public API will be serialized.
-
setIgnoreSyntheticFields
public void setIgnoreSyntheticFields(boolean ignoreSyntheticFields)
Controls if synthetic fields are serialized. Default is true. Calling this method resets thecached fields.- Parameters:
ignoreSyntheticFields- If true, only non-synthetic fields will be serialized.
-
setFixedFieldTypes
public void setFixedFieldTypes(boolean fixedFieldTypes)
Sets the default value forFieldSerializer.CachedField.setClass(Class)to the field's declared type. This allows FieldSerializer to be more efficient, since it knows field values will not be a subclass of their declared type. Default is false. Calling this method resets thecached fields.
-
setCopyTransient
public void setCopyTransient(boolean setCopyTransient)
-
setSerializeTransient
public void setSerializeTransient(boolean setSerializeTransient)
-
setOptimizedGenerics
public void setOptimizedGenerics(boolean setOptimizedGenerics)
Controls if the serialization of generics should be optimized for smaller size.Important: This setting changes the serialized representation, so that data can be deserialized only with if this setting is the same as it was for serialization.
- Parameters:
setOptimizedGenerics- If true, the serialization of generics will be optimize for smaller size (default: false)
-
write
public void write(Kryo kryo, Output output, T object)
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.- Specified by:
writein classSerializer<T>object- May be null ifSerializer.getAcceptsNull()is true.
-
read
public T read(Kryo kryo, Input input, java.lang.Class<T> type)
Description copied from class:SerializerReads 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 usesKryoto read a child object may need to be reentrant.This method should not be called directly, instead this serializer can be passed to
Kryoread methods that accept a serialier.- Specified by:
readin classSerializer<T>- Returns:
- May be null if
Serializer.getAcceptsNull()is true.
-
create
protected T create(Kryo kryo, Input input, java.lang.Class<T> type)
Used byread(Kryo, Input, Class)to create the new object. This can be overridden to customize object creation, eg to call a constructor with arguments. The default implementation usesKryo.newInstance(Class).
-
getField
public FieldSerializer.CachedField getField(java.lang.String fieldName)
Allows specific fields to be optimized.
-
getCachedFieldName
protected java.lang.String getCachedFieldName(FieldSerializer.CachedField cachedField)
-
removeField
public void removeField(java.lang.String fieldName)
Removes a field so that it won't be serialized.
-
removeField
public void removeField(FieldSerializer.CachedField removeField)
Removes a field so that it won't be serialized.
-
getFields
public FieldSerializer.CachedField[] getFields()
Get all fields controlled by this FieldSerializer- Returns:
- all fields controlled by this FieldSerializer
-
getTransientFields
public FieldSerializer.CachedField[] getTransientFields()
Get all transient fields controlled by this FieldSerializer- Returns:
- all transient fields controlled by this FieldSerializer
-
getType
public java.lang.Class getType()
-
getKryo
public Kryo getKryo()
-
getCopyTransient
public boolean getCopyTransient()
-
getSerializeTransient
public boolean getSerializeTransient()
-
createCopy
protected T createCopy(Kryo kryo, T original)
Used bycopy(Kryo, Object)to create the new object. This can be overridden to customize object creation, eg to call a constructor with arguments. The default implementation usesKryo.newInstance(Class).
-
copy
public T copy(Kryo kryo, T original)
Description copied from class:SerializerReturns a copy of the specified object. The default implementation returns the original ifSerializer.isImmutable()is true, else throwsKryoException. Subclasses should override this method if needed to supportKryo.copy(Object).Before Kryo can be used to copy child objects,
Kryo.reference(Object)must be called with the copy to ensure it can be referenced by the child objects. Any serializer that usesKryoto copy a child object may need to be reentrant.This method should not be called directly, instead this serializer can be passed to
Kryocopy methods that accept a serialier.- Overrides:
copyin classSerializer<T>
-
getGenericsScope
final Generics getGenericsScope()
-
getConfig
public C getConfig()
-
-