当前位置: 首页 > 知识库问答 >
问题:

Flink-使用匕首注射-不可串行化?

微生新翰
2023-03-14

我使用Flink(最新的git)从Kafka流到卡桑德拉。为了简化单元测试,我通过dagger添加了依赖注入。

ObjectGraph似乎正确地设置了自己,但是“内部对象”被Flink标记为“不可序列化”。如果我直接包括这些对象,它们会起作用--那么有什么区别呢?

通过Dagger Lazy 实例化的对象也不会序列化。

线程“main”org.apache.flink.api.common.invalidProgramException:对象com.someapp.saveMap@2E029D61不可序列化
...
由:java.io.NotSerializableException:dagg.internal.lazyBinding$1引起

共有1个答案

唐阳晖
2023-03-14

在深入讨论这个问题的细节之前,先介绍一下Apache Flink中函数可序列化的背景知识:

Apache Flink使用Java序列化(Java.io.Serializable)将函数对象(这里是MapFunction)发送给并行执行它们的工作人员。因此,函数需要是可序列化的:函数不能包含任何不可序列化的字段,即非原语类型(int、long、double、...),且未实现java.io.serializable

处理不可序列化构造的典型方法是懒洋洋地初始化它们。

我不太熟悉依赖项注入,但dagger似乎也提供了类似懒惰依赖项的东西,这可能有助于作为类似Scala中懒惰变量的变通方法:

new MapFunction<Long, Long>() {

  @Inject Lazy<MyDependency> dep;

  public Long map(Long value) {
    return dep.get().doSomething(value);
  }
}
 类似资料:
  • 这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。 所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案是设计另一个dagger组件,但不是与appco

  • 我不熟悉匕首和莫基托。我尝试在单元测试中使用Dagger模块中定义的构造函数,以便使用默认值创建对象。 这是模块: @模块类自动关闭倒计时模块{ 这就是我在单元测试中模拟AutoCloseCountDown类的方法: @RunWith(MockitoJUnitRunner.class)公共类AutoCloseCountDownTimerTest{ 如何实现自动关闭的CountDownTimer将在

  • 我是新手,我想在我的课上注入上下文和网络(使用改型)。 这是我到目前为止的代码: 这是我的组件: 但是我如何在应用程序类中使用注入器,这是没有意义的

  • 嗨,我试图找出如何做一个干净的第三方注入。我想把奥托巴士适当地注入我的服务和活动中。我看到你可以在构造函数上使用inject,但是由于我没有任何Android构造函数,我想知道我如何才能inject我的总线。 Iv创建了一个模块,该模块提供了总线的新实例。Iv还创建了一个组件,该组件具有总线对象的接口。 但是我如何才能得到这个注入,我应该在哪里启动我的图表? 我想做的就是: 我看了这个例子(htt

  • 我正在MVVM和Dagger 2中制作小型Android应用程序。但是我不知道如何正确使用Dagger 2,以防我有一个活动和两个片段。这两个片段都是ViewModels的所有者。我已经将ViewModelProvider注入了片段,但我仍然对这个解决方案感到困惑。也许有人会改进我的代码? 活动: 第一个片段: 第二个片段: 在这种情况下,两个片段都可以工作,但我只能在其中一个片段中注入ViewM

  • 我在用匕首2对付科特林。所有工作都很好,但是当我试图将SharedPreferences注入活动时,我的项目甚至不能创建。Gradle控制台说: di\appcomponent.java:6:error:[dagger.android.androidinjector.inject(T)]android.content.sharedpreferences不是nullable,而是由@org.jetb