通过网络序列化rx-java Observable

时间:2014-04-23 16:17:31

标签: scala akka rx-java

我尝试序列化订阅以通过网络发送。我正在使用Scala,做这样的事情:

observable.materialize.subscribe{ n : Notification => sendToNetwork(n)}

但是,我收到了错误:

java.io.NotSerializableException: rx.lang.scala.Notification$OnNext

(确切地说,我使用Akka并尝试将通知发送给远程演员。但我认为这个问题比这更常见)。

它似乎拒绝序列化OnNext类,它实际上是Notification的子类,它是rx.lang.scala.Notification伴随对象的内部类:

http://rxscala.github.io/scaladoc/#rx.lang.scala.Notification $$ OnNext

...我想我在java文档中看到了一个不能序列化内部非静态类的地方。

我对此的理解是否正确?如果是这样,这是rx-java的类层次结构的限制吗?或者有什么方法可以解决这个问题,并序列化Notification s?

2 个答案:

答案 0 :(得分:3)

  

我对此的理解是否正确?

如果外部类是可序列化的,那么可以序列化非静态内部类。但是在Java和Scala中,您需要明确地告诉编译器该类是可序列化的(通过扩展Serializable),并且rx-java Notification和rx-scala OnNext都不可序列化。 / p>

  

或者有什么方法可以解决这个问题,并序列化通知吗?

在Akka中,您可以为任何类编写自己的序列化程序:http://doc.akka.io/docs/akka/snapshot/scala/serialization.html。 Java序列化仅在默认情况下使用。

答案 1 :(得分:1)

Kontraktor-Reactive-Streams提供基于反应流的kick-ass远程性能。 您不会使用Kontraktor,但可以将其用作提供快速远程处理的工具(基于快速序列化)。

public static void remotingRxToRx() {
    Observable<Integer> range = Observable.range(0, 50_000_000);
    Publisher<Integer> pub = RxReactiveStreams.toPublisher(range);

    KxReactiveStreams.get().asRxPublisher(pub)
        .serve(new TCPNIOPublisher().port(3456));

    RateMeasure rm = new RateMeasure("events");

    KxPublisher<Integer> remoteStream =
        KxReactiveStreams.get()
            .connect(Integer.class, new TCPConnectable().host("localhost").port(3456));

    RxReactiveStreams.toObservable(remoteStream)
        .forEach( i -> rm.count() );
}

当前链接: https://github.com/RuedigerMoeller/kontraktor/tree/trunk/modules/reactive-streams/src/examples/src/rxstreamserver

很快就会将

移到一个单独的项目中(只检查我的项目)