小编Boy*_*ame的帖子

序列化对象时包括外部变量

我正在尝试使用Java 8 lambdas并且有关于对象序列化的一般问题.例如,如果executor.execute只有一个方法并且在没有序列化的情况下运行代码块,则以下输入将打印5.但是,如果我通过SerializedLambda序列化lambda表达式并将其反序列化,则它会打印null,因为它在此新的反序列化对象中没有前一个上下文.此外,它编译没有任何投诉,因为第一个上下文解决了外部变量.(本例中为finalVar):

final int finalVar = 5;
executor.execute(() -> {
    System.out.println(finalVar);
});
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能告诉SerializedLambda将finalVar包含到序列化输出中,而不实现具有finalVar变量字段的接口,并在构造时将其值设置为字段.AFAIK,这是用Java做这种事情最干净的方法:

final int finalVar = 5;
executor.execute(new Runnable() {
    int myVar = finalVar;

    public void run() { 
         System.out.println(myVar);
    }
);
Run Code Online (Sandbox Code Playgroud)

我甚至不确定这一点,但我认为编译器可以找出外部变量,并在我尝试序列化该lambda时序列化并包含它们.有没有什么技巧可以让Java做这样的事情,还是有任何语言有这样的功能?

java serialization scala serializable deserialization

6
推荐指数
1
解决办法
233
查看次数

高级主选举算法比欺负算法有什么好处?

我读到当前的主要选举算法如Raft,Paxos或Zab如何选择群集上的主人,并且无法理解为什么他们使用复杂的算法而不是简单的欺负算法.

我正在开发一个集群库,并使用UDP Multicast来处理心跳消息.每个节点都加入一个多播地址,并定期向该地址发送数据报包.如果节点发现有一个新节点将数据包发送到此多播地址,则该节点只是添加到集群中,类似地,当集群中的节点没有从节点获取任何程序包时,它们会将其从集群中删除.当我需要选择一个主节点时,我只需遍历集群中的节点并选择最旧的节点.

我阅读了一些文章,暗示这种方法无效,应该使用像Paxos这样的更复杂的算法,以便通过心跳消息选出主控或检测故障.我无法理解为什么Paxos比传统的欺负算法更适合裂脑情况或其他网络故障,因为我可以很容易地发现当法定数量的节点离开集群而不使用Raft时.我看到的唯一好处是每个服务器必须处理的数据包数量; 只有master在Raft中发送心跳消息,而在这种情况下,每个节点都必须向对方发送心跳消息.但是我不认为这是一个问题,因为我可以简单地实现类似的心跳算法而不改变我的主选举算法.

有人可以详细说明吗?

distributed-computing cluster-computing paxos raft apache-zookeeper

4
推荐指数
1
解决办法
1402
查看次数

使用Stream API将Map转换为另一个Map

我有一个Map<Long, List<Member>>(),我想产生一个Map<Member, Long>由该迭代计算List<Member>Map.Entry<Long, List<Member>>并在成员列表中每个成员的每个映射项的键总结.没有非功能性方法很容易,但是如果没有使用Java 8 Stream API编写自定义收集器,我就找不到方法.我想我需要一些东西,Stream.collect(Collectors.toFlatMap)但是没有这样的方法Collectors.

我能找到的最佳方式是这样的:

       longListOfMemberMap = new HashMap<Long, List<Member>>()
       longListOfMemberMap.put(10, asList(member1, member2));

       Map<Member, Long> collect = longListOfMemberMap.entrySet().stream()
       .collect(new Collector<Map.Entry<Long, List<Member>>, Map<Member, Long>, Map<Member, Long>>() {

        @Override
        public Supplier<Map<Member, Long>> supplier() {
            return HashMap::new;
        }

        @Override
        public BiConsumer<Map<Member, Long>, Map.Entry<Long, List<Member>>> accumulator() {
            return (memberLongMap, tokenRangeListEntry) -> tokenRangeListEntry.getValue().forEach(member -> {
                memberLongMap.compute(member, new BiFunction<Member, Long, Long>() {
                    @Override
                    public Long apply(Member member, Long aLong) {
                        return …
Run Code Online (Sandbox Code Playgroud)

java functional-programming java-8

3
推荐指数
1
解决办法
191
查看次数

如何在运行时编译协议缓冲区架构?

Descriptors.Descriptor我可以使用 DynamicMessage 在运行时动态创建模式 ( ) FileDescriptorProto,也可以使用 DynamicMessage 序列化和反序列化消息。

DynamicMessage然而,由于其构造消息的方式,其性能还不够好。我想知道是否可以在运行时编译模式并在反序列化消息时使用它以获得更好的性能。

如果协议缓冲区不提供在运行时编译模式的方法,那么如果可以将其转换Descriptors.Descriptor为临时 .proto 文件,那么我可以尝试通过从程序调用命令来生成类protoc,并使用 Class 将它们加载到程序中.forName API。

java protocol-buffers java-compiler-api

3
推荐指数
1
解决办法
4835
查看次数