JavaFX集合和JavaFX属性 - XStream序列化问题

时间:2015-10-22 22:02:25

标签: serialization javafx xstream

我正在Java FX中编写应用程序,并且在我的课程中使用了Java FX Properties和Java FX Collections。我读到我无法序列化Java FX集合,所以我这样做了:

public class PurchaseContainer implements Serializable{

 List<Purchase> listOfPurchases;
  @XStreamOmitField
  ObservableList<Purchase> observableListOfPurchases =  FXCollections.observableArrayList(); 
  private Date actualDate;
  int PurchaseID;

我在这里有方法

  public void copyListForSerialization()
{
listOfPurchases = new ArrayList<Purchase>(observableListOfPurchases);

}

但它不起作用。我想当我有这样的属性时,问题可以是Purchase类:

public class Purchase implements Serializable{
  private IntegerProperty purchaseID;
  private IntegerProperty productID;
  private StringProperty specificProductName;
  private DoubleProperty cost; 
  private DoubleProperty discount;
  private StringProperty descriptionOfPurchase;
  private Date purchaseDate;

我阅读了很多教程,但我不知道如何解决我的问题。我是“线程中的异常”JavaFX应用程序线程“java.lang.OutOfMemoryError:Java堆空间”。但这是很短的名单,只有4条记录。所以,我不认为这是由记忆引起的。你有什么想法吗?

1 个答案:

答案 0 :(得分:1)

XStream不为JavaFX集合和属性提供任何转换器。请参阅XSteam github问题跟踪器上的discussion。然而,XStreamFX项目试图填补这一空白。但是我发现特别是XStreamFX的集合实现不起作用,所以我不得不实现自己的转换器:

public class ObservableListConverter extends CollectionConverter implements Converter {

    public ObservableListConverter(Mapper mapper) {
        super(mapper);
    }

    @Override
    public boolean canConvert(Class type) {
        return ObservableList.class.isAssignableFrom(type);
    }

    @Override
    protected Object createCollection(Class type) {
        if (type == ObservableListWrapper.class) {
            return FXCollections.observableArrayList();
        }
        if (type.getName().indexOf("$") > 0) {
            if (type.getName().equals("javafx.collections.FXCollections$SynchronizedObservableList")) {
                return FXCollections.synchronizedObservableList(FXCollections.observableArrayList());
            }
        }
        return new SimpleListProperty<>(FXCollections.observableArrayList());
    }
}

createCollection的实施可能会因您的需求而异。您所要做的就是将此转换器添加到XStream实例:

XStream xstream = new XStream();
xstream.registerConverter(new ObservableListConverter(xstream.getMapper()));

我不确定是否能解决OutOfMemory的问题,但这是使用XStream转换ObservableList的方法。