Java - NotSerializableException (сохранение объекта)

Поэтому сегодня я работаю над плагином для сервера Minecraft. Для этого я создал класс "Track", представляющий гоночную трассу. Чтобы сохранить все существующие треки с их данными, я хочу сохранить весь объект трека, что облегчает мне задачу. В заключение я реализовал Serializable для своего класса Track, чтобы позже использовать ObjectOutputStream. Когда я начинаю сохранять треки, Java создает файл объекта, но также выдает предупреждение / ошибку:

14:19:00] [Поток сервера /WARN]: java.io.NotSerializableException: org.bukkit.craftbukkit.v1_8_R2.CraftWorld [14:19:00] [Поток сервера / WARN]: в java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) [14:19:00] [Серверный поток / WARN]: в java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) [14:19:00] [Серверный поток /WARN]: at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) [14:19:00] [Поток сервера /WARN]: at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) [14:19:00] [Поток сервера / WARN]: в java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) [14:19:00] [Серверный поток / WARN]: в java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) [14:19:00] [Тема сервера /WARN]: at de.avarion.speedrunners.Main.saveTracks(Main.java:206) [14:19:00] [Тема сервера /WARN]: at de.avarion.speedrunners.Main.onDisable(Main.java:48) [14:19:00] [Тема сервера / ПРЕДУПРЕЖДЕНИЕ]: at org.bukkit.plugin.java.Jav aPlugin.setEnabled (JavaPlugin.java:323) [14:19:00] [Поток сервера /WARN]: at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin (JavaPluginLoader.java:359) [14:19:00] [Поток сервера / ПРЕДУПРЕЖДЕНИЕ]: at org.bukkit.plugin.SimplePluginManager.disablePlugin (SimplePluginManager.java:424) [14:19:00] [Поток сервера / WARN]: at org.bukkit.plugin.SimplePluginManager.disablePlugins (.java: 417) [14:19:00] [Серверная ветка / WARN]: по адресу org.bukkit.craftbukkit.v1_8_R2.CraftServer.disablePlugins(CraftServer.java:335) [14:19:00] [Серверная ветка /WARN]: at net.minecraft.server.v1_8_R2.MinecraftServer.stop(MinecraftServer.java:458) [14:19:00] [Тема сервера / ПРЕДУПРЕЖДЕНИЕ]: at net.minecraft.server.v1_8_R2.MinecraftServer.run(MinecraftServer. Java:590) [14:19:00] [Тема сервера / WARN]: на java.lang.Thread.run(Thread.java:745)

Вот часть моего трек класса. Я заметил, что eclipse предупреждает меня, что класс track не объявляет окончательное статическое поле serialVersionUID. Я попытался реализовать по умолчанию и сгенерировал serialVersionUID, но я не помог:

import java.io.Serializable;
import java.util.ArrayList;

import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;

public class Track implements Serializable {

private int playerSize;

private String name;
private World world;
private ArrayList<Player> players;
private Location spawn;

private Sign sign;
private Material finishBlocks;
private Material speedBlocks;

public Track(World world, String name, int playerSize) {
    this.world = world;
    this.name = name; 
    this.playerSize = playerSize;
    this.players = new ArrayList<Player>();
}
//and so on.....

Теперь вот фрагмент кода, где я сохраняю объект дорожки:

private void saveTracks() {
    FileOutputStream outputStream = null;
    ObjectOutputStream objectOutput = null;
    try {
        File directory = new File("tracks");
        if(!directory.exists()) directory.mkdir();
        for(Track track : tracks) {
            outputStream = new FileOutputStream("tracks/" + track.getName() + ".ser");
            objectOutput = new ObjectOutputStream(outputStream);
            objectOutput.writeObject(track);
        }
    }
    catch (IOException e) {
          e.printStackTrace();
    }
    finally {
          if (objectOutput != null) try { objectOutput.close(); } catch (IOException e) {}
          if (outputStream != null) try { outputStream.close(); } catch (IOException e) {}
    }
}

Как я уже говорил, Java создает объект, так что он вроде работает. Но я понятия не имею, как избавиться от предупреждения.

Спасибо за вашу помощь

1 ответ

Это исключение выдает, потому что некоторые поля экземпляра не сериализуются. Поэтому, пожалуйста, проверьте все переменные экземпляра. Если некоторые переменные экземпляра не требуются для сериализации, пожалуйста, добавьте transient к этим переменным.

Согласно документу Java:

Брошенный, когда экземпляр должен иметь Сериализуемый интерфейс. Среда выполнения сериализации или класс экземпляра могут вызвать это исключение. Аргумент должен быть именем класса.

Другие вопросы по тегам