首页 > 解决方案 > Java反序列化文件中的对象列表为空

问题描述

您好,我在将对象列表序列化到控制台中没有抛出任何错误的文件时遇到问题,因此我认为它工作正常。但是,当我尝试从这些文件中反序列化列表时,我返回的列表对于三个列表中的两个为空。


    public static boolean Serialize(Object object,String Directory)
        {
            boolean works = false;
            try
            {
                File outFile = new File(Main.pluginDirectory.getAbsolutePath(),Directory);
                if(outFile.exists()&&outFile.isFile())
                {
    
                }
                else if(!outFile.exists())
                {
                        outFile.createNewFile();
                }
                FileOutputStream file = new FileOutputStream(outFile); 
                ObjectOutputStream out = new ObjectOutputStream(file);
                out.writeObject(object);
                out.close();
                file.close();
                works = true;
            }
            catch(Exception e)
            {
                works = false;
            }
            return works;
        }   
        public static Object Deserialize(String Directory)
        {
            Object rObject = null;
            try
            {
                File file = new File(Main.pluginDirectory.getAbsolutePath(),Directory);
                if(file.exists()&&file.isFile())
                {
                    Utils.Log(ChatColor.GREEN+"File Exists");
                }
                else if(!file.exists())
                {
                    file.createNewFile();
                    Utils.Log(ChatColor.RED+"File at "+file.getAbsolutePath()+" Didn't Exist, Created New File");
                }
                FileInputStream filez = new FileInputStream(file); 
                ObjectInputStream out = new ObjectInputStream(filez);
                rObject = out.readObject();
                out.close();
                filez.close();
            }
            catch(Exception e)
            {
    
            }
            return rObject;
        }

这些是我用来序列化和序列化对象的函数。


    public static void LoadSect() 
        {
            List<LotrSect> sects =(List<LotrSect>)Utils.Deserialize(sectFile);
            if(sects==null)
            {
                Utils.Log(ChatColor.RED+"Null list loaded from file - sect.bin");
            }
            else
            {
                Utils.Log(ChatColor.GOLD+"Loaded "+sects.size()+" Sects");
                SectManager.setList(sects);
            }
    
        }
        public static void LoadFactions() 
        {
            List<LotrFaction> factions = (List<LotrFaction>)Utils.Deserialize(lFactionFile);
            if(factions==null)
            {
                Utils.Log(ChatColor.RED+"Null list loaded from file - faction.bin");
            }
            else
            {
                Utils.Log(ChatColor.GOLD+"Loaded "+factions.size()+" Factions");
                FactionManager.setList(factions);
            }
        }
        public static void loadFPlayer()    
        {
            List<LotrFPlayer> players = (List<LotrFPlayer>)Utils.Deserialize(lFPlayerFile);
            if(players == null)
            {
                Utils.Log(ChatColor.RED+"Null list loaded from file - player.bin");
            }
            else
            {
                Utils.Log(ChatColor.GOLD+"Loaded "+players.size()+" Players");
                LotrFPlayerManager.setLotrFPlayers(players);
            }
        }

这些是我用来加载列表的功能。

    

    public static void saveSect()
        {
            for (LotrSect sect : SectManager.getList())
            {
                Utils.Log(ChatColor.GREEN+"Saving Sect: "+sect.getSect());
            }
            Utils.Serialize(SectManager.getList(), sectFile);
            Utils.Log(ChatColor.GREEN+"Saved "+SectManager.getList().size()+" Sects");
        }
        public static void saveFactions()
        {
            for (LotrFaction fac : FactionManager.getList())
            {
                Utils.Log(ChatColor.GREEN+"Saving Faction: "+fac.getFaction().getTag());
            }
            Utils.Serialize(FactionManager.getList(), factionFile);
            Utils.Log(ChatColor.GREEN+"Saved "+FactionManager.getList().size()+" factions");
        }
        public static void saveFPlayer()
        {
            for(LotrFPlayer player : LotrFPlayerManager.getLotrFPlayers())
            {
                Utils.Log(ChatColor.GREEN+"Saving Player: "+player.getFPlayer().getPlayer().getName());
            }
            Utils.Serialize(LotrFPlayerManager.getLotrFPlayers(), fPlayerFile);
            Utils.Log(ChatColor.GREEN+"Saved "+LotrFPlayerManager.getLotrFPlayers().size()+" Players");
        }

这些是用于保存数据的函数。下面将包括我正在序列化/反序列化的列表中的三类对象。


    package me.Ravi.Lotr;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.bukkit.Location;
    
    import me.Ravi.Lotr.LotrFaction.LotrSectEnum;
    
    public class LotrSect implements Serializable
    {
        private static final long serialVersionUID = 1L;
        LotrSectEnum sect;
        Location Capital;
        String CapitalName;
        boolean isCapitalUnderAttack = false;
        int reinforcementAmount = 0;
        public List<War> wars = new ArrayList<War>();
        public List<LotrFaction> factions = new ArrayList<LotrFaction>();
        public List<LotrFPlayer> players = new ArrayList<LotrFPlayer>();
        public LotrSect(Location Capital, LotrSectEnum sect)
        {
            this.sect = sect;
            this.Capital = Capital;
        }
        public void setReinforcements(int amount)
        {
            if(isCapitalUnderAttack)
            {
                reinforcementAmount = amount;
            }
        }
        public int getReinforcements()
        {
            return reinforcementAmount;
        }
        public LotrSectEnum getSect()
        {
            return sect;
        }
        public Location getCapital()
        {
            return Capital;
        }
        public void setXpBoost()
        {
            
        }
        public void addFaction(LotrFaction faction)
        {
            factions.add(faction);
        }
        public void removeFaction(LotrFaction faction)
        {
            factions.remove(faction);
        }
    }


    package me.Ravi.Lotr;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.bukkit.Location;
    
    import me.Ravi.Lotr.LotrFaction.LotrSectEnum;
    
    public class LotrSect implements Serializable
    {
        private static final long serialVersionUID = 1L;
        LotrSectEnum sect;
        Location Capital;
        String CapitalName;
        boolean isCapitalUnderAttack = false;
        int reinforcementAmount = 0;
        public List<War> wars = new ArrayList<War>();
        public List<LotrFaction> factions = new ArrayList<LotrFaction>();
        public List<LotrFPlayer> players = new ArrayList<LotrFPlayer>();
        public LotrSect(Location Capital, LotrSectEnum sect)
        {
            this.sect = sect;
            this.Capital = Capital;
        }
        public void setReinforcements(int amount)
        {
            if(isCapitalUnderAttack)
            {
                reinforcementAmount = amount;
            }
        }
        public int getReinforcements()
        {
            return reinforcementAmount;
        }
        public LotrSectEnum getSect()
        {
            return sect;
        }
        public Location getCapital()
        {
            return Capital;
        }
        public void setXpBoost()
        {
            
        }
        public void addFaction(LotrFaction faction)
        {
            factions.add(faction);
        }
        public void removeFaction(LotrFaction faction)
        {
            factions.remove(faction);
        }
    }


    package me.Ravi.Lotr;
    
    import java.io.Serializable;
    
    import com.massivecraft.factions.FPlayer;
    
    public class LotrFPlayer implements Serializable
    {
        private static final long serialVersionUID = 1L;
        private FPlayer player;
        public LotrFPlayer(FPlayer player)
        {
            this.player = player;
        }
        public FPlayer getFPlayer()
        {
            return player;
        }
    
    }

在这里我们可以看到,在服务器关闭时,它正在序列化我的所有数据。 序列化图片

但是当我随后启动我的服务器时,我 在启动时反序列化时得到了这个控制台图像。关于 如何完全加载我的 LotrSect 列表令人困惑。但是当我尝试加载 LotrFaction 和 LotrFPlayer 的列表时,它是空的。

标签: javaserializationminecraftbukkit

解决方案


推荐阅读