2015-12-02 2 views
0

Я пишу <Edge> объекты в файл, как этогоJavaFX ObjectInputStream цвет остается нулевой

ObjectOutputStream objectOutputStream = new ObjectOutputStream(
      new FileOutputStream("Object" + level + ".txt")); 

    edgeList = koch.getEdgeList(); 
    for (Edge e : edgeList) { 
     objectOutputStream.writeObject(e); 
    } 

Грань содержит Цвет:

import java.io.Serializable; 
import javafx.scene.paint.Color; 


public class Edge implements Serializable { 

    public double X1, Y1, X2, Y2; 
    transient public Color color; 

    public Edge(double X1, double Y1, double X2, double Y2, Color color) { 
     this.X1 = X1; 
     this.Y1 = Y1; 
     this.X2 = X2; 
     this.Y2 = Y2; 
     this.color = color; 
    } 
} 

Я использую JavaFX и не могу изменить это. Я сделал переходный режим цвета, потому что это вызовет проблемы с Serializable, если я этого не сделаю.

Теперь я прочитал Объектный_файл так:

FileInputStream streamIn = new FileInputStream("Object" + level + ".txt"); 
    ObjectInputStream objectinputstream = new ObjectInputStream(streamIn); 
    int teller = 0; 
    try { 
     for (teller = 0; teller < i; teller++) { 
      Edge edge = (Edge) objectinputstream.readObject(); 
      EdgeList.add(edge); 
     } 
    } catch (OptionalDataException e) { 
     if (!e.eof) { 
      throw e; 
     } 
    } finally { 

     objectinputstream.close(); 

    } 

Проблема у меня есть сейчас, что, когда я прочитал объект Грань из файла, координаты (X1, Y1, X2, Y2) зачитывает отлично. Но цвет NULL, это не вызывает ошибки, но просто не отображает цвет нарисованной линии. Поэтому у меня нет кода ошибки. Я должен вручную установить цвет, но я должен получить цвет из объектного файла.

ответ

0

Используйте пользовательским сериализована форму для Edge класса:

import java.io.Serializable; 
import java.io.ObjectInputStream ; 
import java.io.ObjectOutputStream ; 
import java.io.IOException ; 
import javafx.scene.paint.Color; 


public class Edge implements Serializable { 

    public double X1, Y1, X2, Y2; 
    transient public Color color; 

    public Edge(double X1, double Y1, double X2, double Y2, Color color) { 
     this.X1 = X1; 
     this.Y1 = Y1; 
     this.X2 = X2; 
     this.Y2 = Y2; 
     this.color = color; 
    } 

    private void writeObject(ObjectOutputStream s) throws IOException { 
     s.defaultWriteObject(); 
     s.writeDouble(color.getRed()); 
     s.writeDouble(color.getGreen()); 
     s.writeDouble(color.getBlue()); 
     s.writeDouble(color.getOpacity()); 
    } 

    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { 
     s.defaultReadObject(); 
     double red = s.readDouble(); 
     double green = s.readDouble(); 
     double blue = s.readDouble(); 
     double opacity = s.readDouble(); 
     color = Color.color(red, green, blue, opacity); 
    } 
} 

Это автоматически сериализовать цветовой данные (значения RGBA) для вас, и воссоздать объект цвета из этих данных на десериализации.

Я создал complete demo, который также сериализует свойства JavaFX, используя ту же технику, но слишком длинный, чтобы отправлять сообщения прямо здесь.

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