$ 1.class и $ 2.class - не сериализуемое исключение в jgroups - PullRequest
1 голос
/ 23 апреля 2011

Я создаю демонстрационную программу на Java, используя jgroups в качестве промежуточного программного обеспечения. Мой класс Stock имеет очередь с приоритетами, в которой есть компаратор, и приводит к Stock$1.class и Stock$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 Ответ

3 голосов
/ 23 апреля 2011

Ваши анонимные внутренние классы реализуют только 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;
        }
...