Java 处理中的序列化

Java serialization on Processing

我理解整个概念,但是在 Processing 3.5.3 上尝试它确实使它工作,我觉得我遗漏了一些东西,但在搜索序列化数小时后我得到了这个代码

import java.io.*;
import java.util.*;

void setup() {

  Test test = new Test("Pedro", "1337");
  String fileName = "test.bin";

  try {
    ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(fileName));
    o.writeObject(test);
    o.close();
  } 
  catch (FileNotFoundException e) {
    System.out.println("File not found");
  } 
  catch (IOException e) {
    System.out.println("Error initializing stream");
    e.printStackTrace();
  }


  try {
    ObjectInputStream oi = new ObjectInputStream(new FileInputStream(fileName));
    System.out.println(oi.readObject());
    oi.close();
  } 
  catch (FileNotFoundException e) {
    System.out.println("File not found");
  } 
  catch (IOException e) {
    System.out.println("Error initializing stream");
    e.printStackTrace();
  } 
  catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
  }
}

并且测试 class 是

import java.io.Serializable;

class Test implements Serializable {

  String name;
  String studentId;

  Test (String n, String s) {
    name = n;
    studentId = s;
  }

}

问题似乎出在设置函数的 "o.writeObject(test)" 行,错误是 java.io.NotSerializableException,其中我确保测试 class 确实实现了可序列化,甚至出现同样的错误,这似乎是唯一的问题。 有帮助吗?

编辑: 这是结果

Error initializing stream
java.io.NotSerializableException: testerino
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at testerino.setup(testerino.java:33)
    at processing.core.PApplet.handleDraw(PApplet.java:2425)
    at processing.awt.PSurfaceAWT.callDraw(PSurfaceAWT.java:1547)
    at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:313)
Error initializing stream
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: testerino
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1577)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
    at testerino.setup(testerino.java:47)
    at processing.core.PApplet.handleDraw(PApplet.java:2425)
    at processing.awt.PSurfaceAWT.callDraw(PSurfaceAWT.java:1547)
    at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:313)
Caused by: java.io.NotSerializableException: testerino
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at testerino.setup(testerino.java:33)
    ... 3 more

编辑 2: 我不得不说错误消息说 "java.io.NotSerializableException: testerino",但是 "testerino" 是处理草图的项目名称,所以我的新问题是为什么它尝试序列化整个项目草图?

编辑 3: 我希望这是我最后一次通过添加此文本进行编辑,所以让我解释几个问题: -我正在使用 Processing 3.5.3,我在 post 开头指出 -这个IDE是为动画制作的,意思是,主要的"class"不存在,意思是它使用了一个名为Sketch的文件,这是post上的第一个代码块,我我想说的是没有主要方法,它使用称为 "setup()" "draw()" 的方法来设置主要代码和一个常量循环来制作动画 - "testerino" 是我的项目名称,草图有那个名字,这个项目中只有两个文件,它的草图不允许我实现序列化和 "Test" class,现在,当错误提到 testerino 时,让我问一下为什么它首先尝试序列化。 - 经过过多的研究和测试,我认为代码是完美的,但是除了整数、字符串甚至 ArrayLists 等普通变量之外,处理无法序列化对象,这当然会使我之前的问题过时,除非有人设法找到一种在 Processing 3.5.3 Java

上序列化对象的方法

结论 除非有人想出一种在处理中序列化对象的方法,否则我不能为我的项目做很多事情,我将限制自己在处理中存储普通变量,我已经研究了一天半以上的主题并寻求建议我的大学讲师,他似乎和我在同一页上,尽管他是 Processing 的新手。 这个 post 的一个很好的答案可能是如果有人找到了问题的解决方案,或者什么时候可以声明处理不序列化对象而只序列化变量。 谢谢你的时间。 阿兹

最终编辑: 高于这一点的一切可能都很难找到解决方案,但问题是序列化仅适用于 .java class 文件,处理使用 .pde class 格式,改变文件格式.java 帮助序列化过程。

Test class 放入其自己的选项卡中(如果您还没有)并(重新)命名此选项卡 name.java.