@SuppressWarnings("EqualsWhichDoesntCheckParameterClass") @Override public boolean equals(Object obj) { if (canEqual(obj)) { CompositeSerializer<?> other = (CompositeSerializer<?>) obj; return precomputed.immutable == other.precomputed.immutable && Arrays.equals(fieldSerializers, other.fieldSerializers); } return false; }
@Override public T copy(T from) { Preconditions.checkNotNull(from); if (isImmutableType()) { return from; } Object[] fields = new Object[fieldSerializers.length]; for (int index = 0; index < fieldSerializers.length; index++) { fields[index] = fieldSerializers[index].copy(getField(from, index)); } return createInstance(fields); }
@Override public T deserialize(T reuse, DataInputView source) throws IOException { Preconditions.checkNotNull(reuse); Preconditions.checkNotNull(source); Object[] fields = new Object[fieldSerializers.length]; for (int index = 0; index < fieldSerializers.length; index++) { fields[index] = fieldSerializers[index].deserialize(getField(reuse, index), source); } return precomputed.immutable ? createInstance(fields) : createInstanceWithReuse(fields, reuse); }
@Override public CompositeSerializer<T> duplicate() { return precomputed.stateful ? createSerializerInstance(precomputed, duplicateFieldSerializers(fieldSerializers)) : this; }
@Override public T copy(T from, T reuse) { Preconditions.checkNotNull(from); Preconditions.checkNotNull(reuse); if (isImmutableType()) { return from; } Object[] fields = new Object[fieldSerializers.length]; for (int index = 0; index < fieldSerializers.length; index++) { fields[index] = fieldSerializers[index].copy(getField(from, index), getField(reuse, index)); } return createInstanceWithReuse(fields, reuse); }
@SuppressWarnings("unchecked") private CompatibilityResult<T> ensureFieldCompatibility( List<Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>> previousSerializersAndConfigs) { TypeSerializer<Object>[] convertSerializers = new TypeSerializer[fieldSerializers.length]; boolean requiresMigration = false; for (int index = 0; index < previousSerializersAndConfigs.size(); index++) { CompatibilityResult<Object> compatResult = resolveFieldCompatibility(previousSerializersAndConfigs, index); if (compatResult.isRequiresMigration()) { requiresMigration = true; if (compatResult.getConvertDeserializer() != null) { convertSerializers[index] = new TypeDeserializerAdapter<>(compatResult.getConvertDeserializer()); } else { return CompatibilityResult.requiresMigration(); } } } return requiresMigration ? createMigrationCompatResult(convertSerializers) : CompatibilityResult.compatible(); }
@Override public T createInstance() { Object[] fields = new Object[fieldSerializers.length]; for (int index = 0; index < fieldSerializers.length; index++) { fields[index] = fieldSerializers[index].createInstance(); } return createInstance(fields); }
@Override public void serialize(T record, DataOutputView target) throws IOException { Preconditions.checkNotNull(record); Preconditions.checkNotNull(target); for (int index = 0; index < fieldSerializers.length; index++) { fieldSerializers[index].serialize(getField(record, index), target); } }
private CompatibilityResult<T> createMigrationCompatResult(TypeSerializer<Object>[] convertSerializers) { PrecomputedParameters precomputed = PrecomputedParameters.precompute(this.precomputed.immutableTargetType, convertSerializers); return CompatibilityResult.requiresMigration(createSerializerInstance(precomputed, convertSerializers)); }
@Override public CompatibilityResult<T> ensureCompatibility(TypeSerializerConfigSnapshot configSnapshot) { // We can not remove this method, as long as we support restoring into CompositeTypeSerializerConfigSnapshot. // Previously (pre 1.8), multiple composite serializers were using this class directly as their snapshot class. if (configSnapshot instanceof ConfigSnapshot) { List<Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>> previousSerializersAndConfigs = ((CompositeTypeSerializerConfigSnapshot) configSnapshot).getNestedSerializersAndConfigs(); if (previousSerializersAndConfigs.size() == fieldSerializers.length) { return ensureFieldCompatibility(previousSerializersAndConfigs); } } return CompatibilityResult.requiresMigration(); }
@Override public T copy(T from, T reuse) { Preconditions.checkNotNull(from); Preconditions.checkNotNull(reuse); if (isImmutableType()) { return from; } Object[] fields = new Object[fieldSerializers.length]; for (int index = 0; index < fieldSerializers.length; index++) { fields[index] = fieldSerializers[index].copy(getField(from, index), getField(reuse, index)); } return createInstanceWithReuse(fields, reuse); }
@Override public CompositeSerializer<T> duplicate() { return precomputed.stateful ? createSerializerInstance(precomputed, duplicateFieldSerializers(fieldSerializers)) : this; }
@SuppressWarnings("unchecked") private CompatibilityResult<T> ensureFieldCompatibility( List<Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>> previousSerializersAndConfigs) { TypeSerializer<Object>[] convertSerializers = new TypeSerializer[fieldSerializers.length]; boolean requiresMigration = false; for (int index = 0; index < previousSerializersAndConfigs.size(); index++) { CompatibilityResult<Object> compatResult = resolveFieldCompatibility(previousSerializersAndConfigs, index); if (compatResult.isRequiresMigration()) { requiresMigration = true; if (compatResult.getConvertDeserializer() != null) { convertSerializers[index] = new TypeDeserializerAdapter<>(compatResult.getConvertDeserializer()); } else { return CompatibilityResult.requiresMigration(); } } } return requiresMigration ? createMigrationCompatResult(convertSerializers) : CompatibilityResult.compatible(); }
@Override public T deserialize(DataInputView source) throws IOException { Preconditions.checkNotNull(source); Object[] fields = new Object[fieldSerializers.length]; for (int i = 0; i < fieldSerializers.length; i++) { fields[i] = fieldSerializers[i].deserialize(source); } return createInstance(fields); }
@Override public void serialize(T record, DataOutputView target) throws IOException { Preconditions.checkNotNull(record); Preconditions.checkNotNull(target); for (int index = 0; index < fieldSerializers.length; index++) { fieldSerializers[index].serialize(getField(record, index), target); } }
private CompatibilityResult<T> createMigrationCompatResult(TypeSerializer<Object>[] convertSerializers) { PrecomputedParameters precomputed = PrecomputedParameters.precompute(this.precomputed.immutableTargetType, convertSerializers); return CompatibilityResult.requiresMigration(createSerializerInstance(precomputed, convertSerializers)); }
@Override public CompatibilityResult<T> ensureCompatibility(TypeSerializerConfigSnapshot configSnapshot) { if (configSnapshot instanceof ConfigSnapshot) { List<Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>> previousSerializersAndConfigs = ((CompositeTypeSerializerConfigSnapshot) configSnapshot).getNestedSerializersAndConfigs(); if (previousSerializersAndConfigs.size() == fieldSerializers.length) { return ensureFieldCompatibility(previousSerializersAndConfigs); } } return CompatibilityResult.requiresMigration(); }
@Override public T copy(T from) { Preconditions.checkNotNull(from); if (isImmutableType()) { return from; } Object[] fields = new Object[fieldSerializers.length]; for (int index = 0; index < fieldSerializers.length; index++) { fields[index] = fieldSerializers[index].copy(getField(from, index)); } return createInstance(fields); }
@Override public T deserialize(T reuse, DataInputView source) throws IOException { Preconditions.checkNotNull(reuse); Preconditions.checkNotNull(source); Object[] fields = new Object[fieldSerializers.length]; for (int index = 0; index < fieldSerializers.length; index++) { fields[index] = fieldSerializers[index].deserialize(getField(reuse, index), source); } return precomputed.immutable ? createInstance(fields) : createInstanceWithReuse(fields, reuse); }
@Override public T createInstance() { Object[] fields = new Object[fieldSerializers.length]; for (int index = 0; index < fieldSerializers.length; index++) { fields[index] = fieldSerializers[index].createInstance(); } return createInstance(fields); }