如何在不反序列化的情况下序列化我的对象的几个帧?

时间:2015-12-12 18:19:53

标签: java serialization abstract

我正在尝试在执行程序期间保留我的java对象的“图片”,以便让用户随后查看对象的任何状态。

但问题是,虽然它显然序列化了对象的几个状态,但是当我反序列化它时,不过我选择的“图片”我得到了最后一个状态。

我要序列化的对象之一

public class Board implements IObject{
    /**
     * 
     */
    private static final long serialVersionUID = 3964220699069459042L;
    private char[][] board;
    public static final char X = 'X';
    public static final char O = 'O';
    public static final char blank = '-';

    public Board(int x, int y)
    {
        board = new char[x][y];
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y ; j++) {
                board[i][j] = blank;
            }
        }
    }
    @Override
    public void print()
    {
        for(int i = 0; i < board.length; i++)
        {
            for(int j = 0; j <board[i].length; j++ )
            {
                System.out.print(board[i][j]);
            }
            System.out.println();
        }
    }
}

每次我更换电路板时,都会执行以下操作:

roundStatus.addFrame(rf.getPlayer(), rf.getRound(), rf.getStatus());

我的序列化和反序列化函数

public void addFrame(String p, Integer round, IObject board)
    {
        frames.add(new RoundFrame(p,round,board));
    }

String path;
    ObjectOutput out;

    public void save(String id) 
    {
        path = String.format("%s\\%s\\%s.ser",System.getProperty("user.dir"),LOGPATH,id);
        System.out.println(path);
        File yourFile = new File(path);
        try 
        {
            if(!yourFile.exists()) 
                yourFile.createNewFile();
            out = new ObjectOutputStream(new FileOutputStream(path,true));
            out.writeObject(getFrames());
            out.close();
        } 
        catch(IOException cause) 
        {
            cause.printStackTrace();
        }
    }

    public RoundFrame open(String id, int round)
    {
        RoundFrame ls=null;
        try
        {
            FileInputStream fileIn = new FileInputStream(String.format("%s\\%s\\%s.ser",System.getProperty("user.dir"),LOGPATH,id));
            ObjectInputStream in = new ObjectInputStream(fileIn);
            System.out.println(String.format("%s\\%s\\%s.ser",System.getProperty("user.dir"),LOGPATH,id));
            Object orf = in.readObject();
            if (orf instanceof ArrayList<?>) {
                ArrayList<?> lrf = (ArrayList<?>) orf;
                System.out.println(lrf.size());
                for(Object obj : lrf)
                {
                    RoundFrame rf = (RoundFrame) obj;
                    System.out.println(rf.getRound());
                    if(rf instanceof RoundFrame)
                    {
                        rf.getStatus().print();
                    }
                }
                for(Object obj : lrf)
                {
                    RoundFrame rf = (RoundFrame) obj;
                    System.out.println(rf.getRound());
                    if(rf.getRound() == round && rf instanceof RoundFrame)
                    {
                        ls = rf;
                        break;
                    }
                }
            }
            in.close();
            fileIn.close();

        }catch (FileNotFoundException e) {
            System.err.println("File not found: " + e);
        }catch (EOFException e) {
            System.err.println("End of stream: " + e);
        }catch (IOException e) {
            System.err.println("Read error: " + e);
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
         return ls;
    }

我的Frame类

public class RoundFrame implements Serializable
{
    /**
     * 
     */
    private static final long serialVersionUID = 3565826725666895011L;
    private String player;
    private Integer round;
    private IObject status;

    public RoundFrame()
    {

    }

    public RoundFrame(String p, Integer round, IObject board)
    {
        setPlayer(p);
        setRound(round);
        setStatus(board);       
    }
 /*gets and sets*/
}

圆圈和播放器被很好地序列化,甚至认为IObject也被序列化了,我总是得到同一帧的N个副本。

是否可以保存同一对象的多个状态?

2 个答案:

答案 0 :(得分:2)

每次致电

  

roundStatus.addFrame(rf.getPlayer(),rf.getRound(),rf.getStatus());

您正在传递对板对象的引用。如果编辑电路板并再次调用它,则新帧和最后一帧指向同一个对象,并具有相同的内部值。

我建议使用不可变对象来表示Board,这样你就可以轻松实现你想做的事情并避免像这样的错误。

答案 1 :(得分:0)

  

每次我更换电路板时,都会执行以下操作:

     

roundStatus.addFrame(rf.getPlayer(),rf.getRound(),rf.getStatus());

你是如何改变董事会的?你是在创建董事会对象的副本,还是使用getStatus()进行更改.somechange();

即使您正在创建新的RoundFrame对象

 new RoundFrame(p,round,board)

董事会只是对单个对象的引用。这意味着所有RoundFrame对象都指向同一个板对象。