$ 1.class和$ 2.class不是jgroups中的Serializable异常

时间:2011-04-22 20:54:16

标签: java jgroups

我正在使用jgroups作为中间件在Java中创建一个演示股票交易所分布式程序。我的Stock类有一个优先级队列,它有一个比较器,结果是Stock$1.classStock$2.class以及Stock.class。 Jgroups只能发送可序列化的数据但是从我理解的$1.class$2.class结果来自由于比较器而推断的内部类,并且不可序列化因此导致JGroups的异常,有人可以帮助我如何使它们也可序列化或其他一些微调,以免它看起来像内部类。

import java.io.*;
import java.util.*;
import java.io.Serializable;

public class Stock implements Serializable
{
    public String name;
    public String symbol;
    public int shares = 10000;
    public int price = 100;

    public PriorityQueue<Order> sellList = new PriorityQueue<Order>(100, new Comparator<Order>()
    {
        public int compare(Order oldOrder, Order newOrder)
        {
            int i = oldOrder.price;
            int j = newOrder.price;
            if(i > j)
                return 1;
            else if(i < j)
                return -1;
            else
                return 0;
        }
    }
    );

    public PriorityQueue<Order> buyList = new PriorityQueue<Order>(100, new Comparator<Order>()
            {
                public int compare(Order oldOrder, Order newOrder)
                {
                    int i = oldOrder.price;
                    int j = newOrder.price;
                    if(i > j)
                        return -1;
                    else if(i < j)
                        return 1;
                    else
                        return 0;
                }
            }
        );
}

1 个答案:

答案 0 :(得分:3)

您的匿名内部类只实现Comparator。为了实现Comparator Serializable,您应该将它们转换为静态嵌套类,例如。

public class Stock implements Serializable {

    private static class OrderComparator implements Comparator, Serializable {
        public int compare(Order oldOrder, Order newOrder) {
            int i = oldOrder.price;
            int j = newOrder.price;
            if(i > j) {
                return 1;
            } else if (i < j)
                return -1;
            } else {
                return 0;
            }
        }
    }

    private PriorityQueue<Order> sellList = new PriorityQueue<Order>(100, new OrderComparator());
}

这不仅会解决您的直接问题,而且还可以使代码更具可读性。

顺便说一句,上面的比较器可以更简洁地重写:

        public int compare(Order oldOrder, Order newOrder) {
            return oldOrder.price - newOrder.price;
        }