2015-10-22 6 views
0

Я пишу приложение в Java FX, и я использовал Java FX Properties и Java FX Collections в своих классах. Я читал, что я не могу сериализовать Java FX Коллекции, поэтому я сделал это таким образом:Свойства JavaFX Collections и JavaFX - проблемы сериализации XStream

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 Application Thread «java.lang.OutOfMemoryError: Java heap space». Но это очень короткий список, всего 4 записи. Поэтому я не думаю, что это вызвано памятью. У вас есть идеи?

ответ

0

XStream не предоставляет никаких конвертеров для коллекций и свойств JavaFX. См. discussion в трекер XSteam github. Однако есть проект 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, но это способ преобразовать ObservableList используя XStream.

 Смежные вопросы

  • Нет связанных вопросов^_^