我尝试序列化订阅以通过网络发送。我正在使用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?
答案 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() );
}
很快就会将移到一个单独的项目中(只检查我的项目)