protected Kryo createKryo(ClassResolver classResolver, ReferenceResolver referenceResolver, StreamFactory streamFactory) { Kryo kryo = new Kryo(classResolver, referenceResolver, streamFactory); // Maintain Kryo compatibility (pre version 4) - can turn this off by calling withOptimizedGenerics(false) kryo.getFieldSerializerConfig().setOptimizedGenerics(true); return kryo; }
@Override protected TaggedFieldSerializerConfig clone () { return (TaggedFieldSerializerConfig)super.clone(); } }
public boolean getCopyTransient () { return config.isCopyTransient(); }
CachedField newCachedField (Field field, int fieldIndex, int accessIndex) { Class[] fieldClass = new Class[] {field.getType()}; Type fieldGenericType = (config.isOptimizedGenerics()) ? field.getGenericType() : null; CachedField cachedField; if (!config.isOptimizedGenerics() || fieldGenericType == fieldClass[0]) { // For optimized generics this is a field without generic type parameters if (TRACE) trace("kryo", "Field " + field.getName() + ": " + fieldClass[0]); cachedField = newMatchingCachedField(field, accessIndex, fieldClass[0], fieldGenericType, null); } else { cachedField = genericsUtil.newCachedFieldOfGenericType(field, accessIndex, fieldClass, fieldGenericType); } if (cachedField instanceof ObjectField) { hasObjectFields = true; } cachedField.field = field; cachedField.varIntsEnabled = varIntsEnabled; if (!config.isUseAsm()) { cachedField.offset = unsafeUtil.getObjectFieldOffset(field); } cachedField.access = (FieldAccess)access; cachedField.accessIndex = accessIndex; cachedField.canBeNull = config.isFieldsCanBeNull() && !fieldClass[0].isPrimitive() && !field.isAnnotationPresent(NotNull.class); // Always use the same serializer for this field if the field's class is final. if (kryo.isFinal(fieldClass[0]) || config.isFixedFieldTypes()) cachedField.valueClass = fieldClass[0]; return cachedField; }
public InjectingSerializer(final Kryo kryo, final Class type, final InjectionMapping mapping) { super(kryo, type); this.mapping = Preconditions.checkNotNull(mapping, "injection mapping is required"); config.setIgnoreSyntheticFields(true); config.setFieldsAsAccessible(true); transformFields(); }
/** Tells Kryo, if ASM-based backend should be used by new serializer instances created using this Kryo instance. Already * existing serializer instances are not affected by this setting. * * <p> * By default, Kryo uses ASM-based backend. * </p> * * @param flag if true, ASM-based backend will be used. Otherwise Unsafe-based backend could be used by some serializers, e.g. * FieldSerializer * * @deprecated Use {@link #getFieldSerializerConfig()} to change the default {@link FieldSerializer} configuration. */ @Deprecated public void setAsmEnabled (boolean flag) { fieldSerializerConfig.setUseAsm(flag); }
private List<Field> buildValidFields (boolean transientFields, List<Field> allFields, ObjectMap context, IntArray useAsm) { List<Field> result = new ArrayList(allFields.size()); for (int i = 0, n = allFields.size(); i < n; i++) { Field field = allFields.get(i); int modifiers = field.getModifiers(); if (Modifier.isTransient(modifiers) != transientFields) continue; if (Modifier.isStatic(modifiers)) continue; if (field.isSynthetic() && config.isIgnoreSyntheticFields()) continue; if (!field.isAccessible()) { if (!config.isSetFieldsAsAccessible()) continue; try { field.setAccessible(true); } catch (AccessControlException ex) { continue; } } Optional optional = field.getAnnotation(Optional.class); if (optional != null && !context.containsKey(optional.value())) continue; result.add(field); // BOZO - Must be public? useAsm .add(!Modifier.isFinal(modifiers) && Modifier.isPublic(modifiers) && Modifier.isPublic(field.getType().getModifiers()) ? 1 : 0); } return result; }
/** Controls which fields are serialized. Calling this method resets the {@link #getFields() cached fields}. * @param setFieldsAsAccessible If true, all non-transient fields (inlcuding private fields) will be serialized and * {@link Field#setAccessible(boolean) set as accessible} if necessary (default). If false, only fields in the public * API will be serialized. */ public void setFieldsAsAccessible (boolean setFieldsAsAccessible) { config.setFieldsAsAccessible(setFieldsAsAccessible); rebuildCachedFields(); }
/** Controls if synthetic fields are serialized. Default is true. Calling this method resets the {@link #getFields() cached * fields}. * @param ignoreSyntheticFields If true, only non-synthetic fields will be serialized. */ public void setIgnoreSyntheticFields (boolean ignoreSyntheticFields) { config.setIgnoreSyntheticFields(ignoreSyntheticFields); rebuildCachedFields(); }
protected String getCachedFieldName (CachedField cachedField) { return config.getCachedFieldNameStrategy().getName(cachedField); }
CachedField newCachedField (Field field, int fieldIndex, int accessIndex) { Class[] fieldClass = new Class[] {field.getType()}; Type fieldGenericType = (config.isOptimizedGenerics()) ? field.getGenericType() : null; CachedField cachedField; if (!config.isOptimizedGenerics() || fieldGenericType == fieldClass[0]) { // For optimized generics this is a field without generic type parameters if (TRACE) trace("kryo", "Field " + field.getName() + ": " + fieldClass[0]); cachedField = newMatchingCachedField(field, accessIndex, fieldClass[0], fieldGenericType, null); } else { cachedField = genericsUtil.newCachedFieldOfGenericType(field, accessIndex, fieldClass, fieldGenericType); } if (cachedField instanceof ObjectField) { hasObjectFields = true; } cachedField.field = field; cachedField.varIntsEnabled = varIntsEnabled; if (!config.isUseAsm()) { cachedField.offset = unsafeUtil.getObjectFieldOffset(field); } cachedField.access = (FieldAccess)access; cachedField.accessIndex = accessIndex; cachedField.canBeNull = config.isFieldsCanBeNull() && !fieldClass[0].isPrimitive() && !field.isAnnotationPresent(NotNull.class); // Always use the same serializer for this field if the field's class is final. if (kryo.isFinal(fieldClass[0]) || config.isFixedFieldTypes()) cachedField.valueClass = fieldClass[0]; return cachedField; }
/** Tells Kryo, if ASM-based backend should be used by new serializer instances created using this Kryo instance. Already * existing serializer instances are not affected by this setting. * * <p> * By default, Kryo uses ASM-based backend. * </p> * * @param flag if true, ASM-based backend will be used. Otherwise Unsafe-based backend could be used by some serializers, e.g. * FieldSerializer * * @deprecated Use {@link #getFieldSerializerConfig()} to change the default {@link FieldSerializer} configuration. */ @Deprecated public void setAsmEnabled (boolean flag) { fieldSerializerConfig.setUseAsm(flag); }
private List<Field> buildValidFields (boolean transientFields, List<Field> allFields, ObjectMap context, IntArray useAsm) { List<Field> result = new ArrayList(allFields.size()); for (int i = 0, n = allFields.size(); i < n; i++) { Field field = allFields.get(i); int modifiers = field.getModifiers(); if (Modifier.isTransient(modifiers) != transientFields) continue; if (Modifier.isStatic(modifiers)) continue; if (field.isSynthetic() && config.isIgnoreSyntheticFields()) continue; if (!field.isAccessible()) { if (!config.isSetFieldsAsAccessible()) continue; try { field.setAccessible(true); } catch (AccessControlException ex) { continue; } } Optional optional = field.getAnnotation(Optional.class); if (optional != null && !context.containsKey(optional.value())) continue; result.add(field); // BOZO - Must be public? useAsm .add(!Modifier.isFinal(modifiers) && Modifier.isPublic(modifiers) && Modifier.isPublic(field.getType().getModifiers()) ? 1 : 0); } return result; }
/** Controls which fields are serialized. Calling this method resets the {@link #getFields() cached fields}. * @param setFieldsAsAccessible If true, all non-transient fields (inlcuding private fields) will be serialized and * {@link Field#setAccessible(boolean) set as accessible} if necessary (default). If false, only fields in the public * API will be serialized. */ public void setFieldsAsAccessible (boolean setFieldsAsAccessible) { config.setFieldsAsAccessible(setFieldsAsAccessible); rebuildCachedFields(); }
/** Controls if synthetic fields are serialized. Default is true. Calling this method resets the {@link #getFields() cached * fields}. * @param ignoreSyntheticFields If true, only non-synthetic fields will be serialized. */ public void setIgnoreSyntheticFields (boolean ignoreSyntheticFields) { config.setIgnoreSyntheticFields(ignoreSyntheticFields); rebuildCachedFields(); }
protected String getCachedFieldName (CachedField cachedField) { return config.getCachedFieldNameStrategy().getName(cachedField); }
/** Controls whether ASM should be used. Calling this method resets the {@link #getFields() cached fields}. * @param setUseAsm If true, ASM will be used for fast serialization. If false, Unsafe will be used (default) */ public void setUseAsm (boolean setUseAsm) { config.setUseAsm(setUseAsm); rebuildCachedFields(); }
@Override public Kryo build() { Kryo k = this.buildFrom(KryoBuilder.this); k.getFieldSerializerConfig().setOptimizedGenerics(optimizedGenerics); return k; } };
public boolean getCopyTransient () { return config.isCopyTransient(); }
@Override protected TaggedFieldSerializerConfig clone () { return (TaggedFieldSerializerConfig)super.clone(); } }