#apache-flink
Вопрос:
У меня есть класс Java, который используется для хранения состояния:
public class Speed { public Speed() {} public Speed(double speed, Telemetry telemetry) { this.speed = speed; this.telemetry = telemetry; } public double speed; public Telemetry telemetry; }
Телеметрия-это не класс POJO, и я предоставил для нее serde.
public class TelemetryKryoSerializerlt;T extends Telemetrygt; extends Serializerlt;Tgt; { @Override public void write(Kryo kryo, Output output, T object) { byte[] bytes; TelemetryProto.Builder builder = object.toProtoBuilder(); bytes = builder.build().toByteArray(); output.writeInt(bytes.length); output.write(bytes); } @Override public T read(Kryo kryo, Input input, Classlt;Tgt; type) { int l = input.readInt(); byte[] bytes = input.readBytes(l); Telemetry telemetry = null; telemetry = Telemetry.parseFrom(bytes); return (T) telemetry; } }
Как я могу подтвердить, рассматривается ли указанный выше класс как класс POJO или общий класс?
Обновить:
Я зарегистрировал класс телеметрии и его сериализатор следующим образом:
env.getConfig().registerTypeWithKryoSerializer(DataElement.class, DataElementKryoSerializer.class);
Ниже приведены результаты упомянутых методов getRegistered* :
Registered Kryo types: lt;NONEgt; Registered Pojo types: class a.b.c.Telemetry does not contain a getter for field telemetryProtoBuilder class a.b.c.Telemetry does not contain a setter for field telemetryProtoBuilder Class class a.b.c.Telemetry cannot be used as a POJO type because not all fields are valid POJO fields, and must be processed as GenericType. Please read the Flink documentation on "Data Types amp; Serialization" for details of the effect on performance. TypeSerializer for Telemetry org.apache.flink.api.java.typeutils.runtime.kryo.KryoSerializer class a.b.c.Telemetry does not contain a getter for field telemetryProtoBuilder class a.b.c.Telemetry does not contain a setter for field telemetryProtoBuilder Class class a.b.c.Telemetry cannot be used as a POJO type because not all fields are valid POJO fields, and must be processed as GenericType. Please read the Flink documentation on "Data Types amp; Serialization" for details of the effect on performance.
Ответ №1:
Все это полезно для отладки проблем сериализации:
ExecutionConfig#getDefaultKryoSerializerClasses()
ExecutionConfig#getRegisteredKryoTypes()
ExecutionConfig#getRegisteredPojoTypes()
TypeInformation#of(MyClass.class).createSerializer()
Последний из них покажет вам, для какого сериализатора используется Флинк MyClass
.
Комментарии:
1. Я обновил свой вопрос с выводом методов, о которых вы упомянули, очень полезно.
TypeSerializer
Для телеметрии указанKryoSerializer
сериализатор и сериализатор, который я зарегистрировал. Не могли бы вы, пожалуйста, помочь мне понять, почему?2. Что это значит, когда класс не может использоваться как тип POJO и обрабатываться как тип GenericType. Каковы последствия этого? И имеет ли это значение в данном случае, учитывая, что предусмотрен де/сериализатор?