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 的方法
我正在 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 的方法