相关问题:https://issues.apache.org/jira/browse/FLINK-14380
在使用类型提取器确定类是否符合POJO时,Flink将检查该类是否实现了setter和getter方法。对于setter方法,Flink声明返回类型为Sub Button8_Click()
Sheets("DB - Ref Current").Range("Ref_Current").Copy
Sheets("DB - Ref Monthly").Range("Ref_" & Range("MonthSelector").Value).PasteSpecial xlPasteAll
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
。如果使用案例类,因为案例类设置器的返回类型经常是对象类的副本,则这是一个问题。考虑以下案例类:
Void
尽管提供了getter(生成的)和setter方法,但由于setter的返回类型不是空的,因此该类将被识别为无效的POJO。
此问题不鼓励不变性,并且在不退回Kryo序列化程序的情况下无法使用案例类。
问题位于第1806行的https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java中。这是该行的永久链接
if支票的副本在这里
case class SomeClass(x: Int) {
x_=(newX: Int): SomeClass = { this.copy(x = newX) }
}
我相信
if((methodNameLow.equals("set"+fieldNameLow) || methodNameLow.equals(fieldNameLow+"_$eq")) &&
m.getParameterTypes().length == 1 && // one parameter of the field's type
(m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper != null && m.getParameterTypes()[0].equals( fieldTypeWrapper )) || (fieldTypeGeneric != null && m.getGenericParameterTypes()[0].equals(fieldTypeGeneric) ) )&&
// return type is void.
m.getReturnType().equals(Void.TYPE)
) {
hasSetter = true;
}
}
应修改为
m.getReturnType().equals(Void.TYPE)
这将允许案例类设置器返回对象的副本,从而启用用例类。这使我们能够保持不变,而不会被迫退回到Kryo串行器。
我很好奇此更改将如何与序列化程序和反序列化程序交互。我认为串行器/反序列化器可能以无法实现的方式使用setter方法。如果是这种情况,有什么方法可以在Flink中将Scala案例类用于POJO样式对象?