2011-04-22 30 views
1

我正在使用jgroups作爲中間件創建一個演示股票交易分佈式程序。我的股票類別有一個優先級隊列,它有一個比較器,結果爲Stock$1.classStock$2.class以及Stock.class。 Jgroups只能發送可序列化的數據,但從我理解的$1.class$2.class結果是由於比較器推斷的內部類而導致的,因此不能序列化,從而導致JGroups出現異常,有人可以幫助我如何使它們可序列化或其他一些tweek不要讓它看起來像內部類。

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; 
       } 
      } 
     ); 
} 
+0

重新建立了新> java.io.NotSerializableException:庫存在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)$ 2 \t \t在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) \t在java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:422) \t在java.util.PriorityQueue.writeObject(PriorityQueue.java:686 ) \t在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) \t在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) \t在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) \t在java.lang – Yogesh 2011-04-22 20:57:46

回答

3

你的匿名內部類只實現Comparator。爲了實現ComparatorSerializable,您應該將它們轉換爲靜態嵌套類,例如,

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; 
     } 
+0

+1我應該指出兩個比較器是不一樣的。 「-1」和「1」在OP的頂部和底部反轉。但是,仍然可以應用相同的概念,並且仍然獲得提取到私有靜態類的可讀性(和可重用性)。 – corsiKa 2011-04-22 21:03:46

+0

我也想指出,我會建議不要在比較中使用減法。考慮訂單並退款。如果你的oldOrder有'-2000000000',newOrder有'1000000000',你的'old-new = -3000000000'會溢出到正的區域,結果真的是負值。 – corsiKa 2011-04-22 21:06:55

+0

@ glowcoder:公平點。我總是得到比較錯誤的方式:) – skaffman 2011-04-22 21:13:15