我正在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条记录。所以,我不认为这是由记忆引起的。你有什么想法吗?
答案 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的方法。