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

JavaFX Collections and JavaFX properties - XStream serialization problems

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

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 class 当我有这样的属性时:

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;

我阅读了很多教程,但我不知道如何解决我的问题。我有 "Exception in thread "JavaFX 应用程序线程“java.lang.OutOfMemoryError:Java 堆 space”。但这是一个很短的列表,只有 4 条记录。所以,我不认为这是由记忆引起的。你有什么想法吗?

XStream 不为 JavaFX 集合和属性提供任何转换器。请参阅试图填补该空白的 discussion on the XSteam github issue tracker. There is however the 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 的方法