如何从Java中的构造函数反序列化对象?

时间:2013-05-21 11:38:02

标签: java object deserialization

我正在尝试做一些我从未做过的时髦的事情。

所以我想做的是: 我通过执行以下操作来创建对象

Player playerVar = new Player(1234);
然后

玩家构造函数会找到一个玩家called 1234,如果它存在,它将反序列化并将加载的对象存储在'playerVar', if not it'll just follow through and give a'blank'`玩家对象下。< / p>

我不确定它是否可能使当前对象成为同一对象的另一个实例,所以我在这里发帖。

这基本上就是我想要做的。

this = deserielizedObject

我知道这一切都可以通过加载对象,然后手动设置所有必要的变量来完成,但这并不理想。我怎样才能从一个内部的另一个实例中“替换”一个对象

这是我目前的代码

player.java

    public class Player implements java.io.Serializable
    {
        Player(String GUID) // when loading a new player
        {
            Player player = loadPlayer(GUID);
            //i want to set this to player
            // something like     this = player     If you know what i mean....
        }
        Player()//when creating a new player
        {

        }

        private Player loadPlayer(String GUID)
        {
            File f = new File("data/players/"+GUID+".ser");
            if(!f.exists())
            {
                Player player = new Player();
                return player;
            }
                Player player = null;
            try
            {
                FileInputStream fileIn = new FileInputStream("data/players/"+GUID+".ser");
                ObjectInputStream in = new ObjectInputStream(fileIn);
                player = (Player) in.readObject();
                in.close();
                fileIn.close();
            }
            catch(IOException i)
            {
                i.printStackTrace();
                return null;
            }
            catch(ClassNotFoundException c)
            {
                System.out.println("Cant find Player Class!");
                c.printStackTrace();
                return null;
            }
            return player;
        }

        private int guid;
        private String name;
        private int bankMoney;
        .......
        ...
        .


    }

3 个答案:

答案 0 :(得分:2)

您可以使用工厂类/方法。在您的情况下,最简单的方法可能是将loadPlayer作为公共静态方法。

    public static Player loadPlayer(String GUID)
    {
        ...
        return player;
    }

然后:

Player playerVar = Player.loadPlayer(1234);

答案 1 :(得分:0)

您描述的内容是不可能的。但是你可以创建一个(静态)工厂方法而不是构造函数,它可以反序列化或创建一个新实例。

答案 2 :(得分:0)

您无法为this分配值,这是不可能的。为什么不直接调用loadPlayer方法:

Player player = Player.loadPlayer(GUID); //having loadPlayer as public static