2013-06-26 5 views
2

Я пытаюсь сделать 3D-матрицу цветных квадратов с обработкой. Он отлично работает, но когда я хочу сохранить его в файле, который выполняет сериализацию объекта DataMatrix, я получаю это исключение: java.io.NotSerializableException. И Square, и DataMatrix реализуют Serializable, поэтому я не знаю, что может вызвать его.Сериализация объектов Java (Обработка)

FileManager:

class FileManager 
{ 

    FileManager() 
    {} 

    public void saveMatrix(String path, DataMatrix dm) 
    { 
    try 
    { 
    FileOutputStream file = new FileOutputStream(path); 
    ObjectOutputStream output = new ObjectOutputStream(file); 
    output.writeObject(dm); 
    output.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 

    public DataMatrix openMatrix(String path) 
    { 
    DataMatrix dm = null; 

    try 
    { 

     FileInputStream file = new FileInputStream(path); 
     ObjectInputStream input = new ObjectInputStream(file); 
     Object aux = input.readObject(); 
     input.close(); 
     if(aux instanceof DataMatrix) 
     { 
     dm = (DataMatrix)aux; 
     }   
    } 
    catch (EOFException e1) 
    { 
     System.out.println ("Fin de fichero"); 
    } 
    catch (Exception e2) 
    { 
     e2.printStackTrace(); 
    } 

    return dm; 
    } 
} 

Data Matrix:

class DataMatrix implements Serializable 
{ 

    Square[][][] dataMatrix; 

    DataMatrix() 
    { 
     dataMatrix = new Square[5][32][32]; 
    } 

    public void setSquare(int x, int y, int z, color c, String type) 
    { 

    dataMatrix[z][x][y].setSquare(c,type); 

    } 

Площадь:

class Square implements Serializable 
{ 

    public int x; 
    public int y; 
    public int z; 
    public color c; 
    public String type; 

    Square(int xx, int yy, int zz, color cc, String tt){ 
    x = xx; 
    y = yy; 
    z = zz; 
    c = cc; 
    type = tt; 
    } 

    public void setSquare(color cc, String tt){ 

    c = cc; 
    type = tt; 

    } 

    public void printSquare() 
    { 
    println(green(c) +" "+ type); 
    } 

} 

Журнал ошибок:

java.io.NotSerializableException: processing.core.PApplet$InternalEventQueue 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
    at maindatamatrix$FileManager.saveMatrix(maindatamatrix.java:105) 
    at maindatamatrix.setup(maindatamatrix.java:30) 
    at processing.core.PApplet.handleDraw(PApplet.java:2245) 
    at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243) 
    at processing.core.PApplet.run(PApplet.java:2141) 
    at java.lang.Thread.run(Thread.java:662) 
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: processing.core.PApplet$InternalEventQueue 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1666) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1322) 
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1666) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1322) 
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1666) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1322) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 
    at maindatamatrix$FileManager.openMatrix(maindatamatrix.java:123) 
    at maindatamatrix.setup(maindatamatrix.java:33) 
    at processing.core.PApplet.handleDraw(PApplet.java:2245) 
    at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243) 
    at processing.core.PApplet.run(PApplet.java:2141) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.io.NotSerializableException: processing.core.PApplet$InternalEventQueue 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
    at maindatamatrix$FileManager.saveMatrix(maindatamatrix.java:105) 
    at maindatamatrix.setup(maindatamatrix.java:30) 
    ... 4 more 

Я мог бы быть класс цвета, поэтому я использовал временный модификатор, чтобы проверить его. По-прежнему такая же ошибка. Есть идеи?

+0

Что это за «цвет»? – NINCOMPOOP

+0

Это родной класс в обработке – Phob1a

+0

@ Phob1a, что вы имеете в виду с «родным классом»? –

ответ

3

Для достижения этой цели я должен был:

  • переименовывать все классы, которые реализуют Serializable к .java, так DataMatrix становится DataMatrix.java и площади становится Square.java
  • использование int вместо color в этих классах
  • добавить недостающую импорт в этих классах

Вот код:

SerializableTest.pde:

void setup(){ 
    DataMatrix dm = new DataMatrix(); 
    FileManager f = new FileManager(); 
    f.saveMatrix("/Users/me/test", dm); 
} 

DataMatrix.java:

import java.io.Serializable; 

class DataMatrix implements Serializable 
{ 

    Square[][][] dataMatrix; 

    DataMatrix() 
    { 
     dataMatrix = new Square[5][32][32]; 
    } 

    public void setSquare(int x, int y, int z, int c, String type) 
    { 

    dataMatrix[z][x][y].setSquare(c,type); 

    } 
} 

FileManager.pde:

import java.io.FileOutputStream; 
import java.io.ObjectOutputStream; 
import java.io.FileInputStream; 
import java.io.ObjectInputStream; 
import java.io.EOFException; 

class FileManager 
{ 

    FileManager() 
    {} 

    public void saveMatrix(String path, DataMatrix dm) 
    { 
    try 
    { 
    FileOutputStream file = new FileOutputStream(path); 
    ObjectOutputStream output = new ObjectOutputStream(file); 
    output.writeObject(dm); 
    output.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 

    public DataMatrix openMatrix(String path) 
    { 
    DataMatrix dm = null; 

    try 
    { 

     FileInputStream file = new FileInputStream(path); 
     ObjectInputStream input = new ObjectInputStream(file); 
     Object aux = input.readObject(); 
     input.close(); 
     if(aux instanceof DataMatrix) 
     { 
     dm = (DataMatrix)aux; 
     }   
    } 
    catch (EOFException e1) 
    { 
     System.out.println ("Fin de fichero"); 
    } 
    catch (Exception e2) 
    { 
     e2.printStackTrace(); 
    } 

    return dm; 
    } 
} 

Square.java: сам

import java.io.Serializable; 
import processing.core.*; 

class Square implements Serializable 
{ 

    public int x; 
    public int y; 
    public int z; 
    public int c; 
    public String type; 

    Square(int xx, int yy, int zz, int cc, String tt){ 
    x = xx; 
    y = yy; 
    z = zz; 
    c = cc; 
    type = tt; 
    } 

    public void setSquare(int cc, String tt){ 

    c = cc; 
    type = tt; 

    } 

    public void printSquare() 
    { 
    //System.out.println(PApplet.green(c) +" "+ type); 
    int g = (c >> 8) & 0xFF; // Faster way of getting green(argb) 
    System.out.println(g); 
    } 

} 
2

его, кажется, что в файле класса менеджера, внутри попытаться заблокировать поля вашего объекта, в свою очередь свои поля, некоторые из которых не реализуют Serializable ...

если цвет класс реализует сериализации .. ?? , если вы используете некоторую стороннюю библиотеку, которые не являются сериализуемыми. Попробуйте использовать сериализацию на основе XML или другие форматы сериализации, такие как json.

+0

Нет класса ** color **. Обработка IDE обрабатывает цветовые переменные как ** ints **. – Pwdr

1

Ну, я действительно протестировал ваш код, но изменил неизвестный класс цвета для простой строки. Он написал файл без жалоб, поэтому я хотел бы предположить следующее:

  1. Может быть, когда вы объявили переходными, вы запускали старую скомпилированную версию? Это может произойти в зависимости от того, как вы настраиваете среду компиляции/выполнения.

  2. Тогда класс цвета может вызвать проблемы. Можете ли вы точно указать имя пакета этого класса, чтобы мы могли его искать?

  3. В ваших импортных условиях, вы уверены, что импортируете, как это? Со мной случилось, в основном, в затмении, что вы получаете неправильный импорт, когда вы позволяете Eclipse помочь вам.

    импорт java.io.Serializable;

  4. Какая версия Java вы используете и где вы используете свой код? Это похоже на часть апплета?

Согласно последнему ответу, я мог бы рекомендовать следующие действия:

3 магазина переменные в классе Square:

private int r; 
private int g; 
private int b; 

public void setColor(int r, int g, int b) { 
    this.r = r; 
    this.g = g; 
    this.b = b; 
} 

public color getColor() { 
    return color(r, g, b); 
} 

Таким образом, вы избавитесь от вопроса цвета сериализации.

Кстати, я предполагаю, что вы имеете в виду это, обработка: http://processing.org

+0

Я собираюсь попробовать это прямо сейчас, спасибо за ответ. – Phob1a

1

Oracle имеет deemphasized сериализуемый интерфейс и DataInputStream и классы DataOutputStream.

Проблема с этой старинной сериализацией заключается в том, что если вы изменяете поля в своем объекте, которые необходимо сохранить в ваш двоичный файл, ваши существующие файлы несовместимы с вашими новыми версиями вашего программного обеспечения.

Я предлагаю вам определить свои собственные форматы файлов и сохранить ответственность за свою собственную судьбу. Это требует немного усилий, но тогда вы не «красите себя в угол» надолго.

Я предпочел бы использовать файл XML, чем старинная сериализация Java.

Если вы действительно хотите получить двоичный файл, вы можете использовать DataInputStream и DataOutputStream, а также читать и писать свои собственные поля.

Но я думаю, что XML лучше всего потому, что полученные файлы «доступны для человека» и даже «редактируются человеком».

Когда я создаю формат файла (или формат для передачи данных), я думаю, что неплохо иметь номер версии, который определяет, какая версия формата файла есть. Возможно, вам не нужен этот номер версии в формате файла, но при этом он дает вам больше гибкости в будущем.