2016-01-24 45 views
0
package thegreatestrpgevermade; 
import java.util.HashMap; 
import java.lang.reflect.*; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.io.Externalizable; 
import javax.swing.Action; 
import javax.swing.AbstractAction; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.io.ObjectInputStream; 
import java.io.FileOutputStream; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.ObjectInput; 
import java.io.ObjectOutput; 
public class Room implements Externalizable 
{ 
    static Room room; 
    HashMap<Integer,ParentObject> ParentObjectMap ; 
    int roomNumber ; 
    int width ; 
    int height ; 
    int idNumber ; 
    static ActionClass actionClass; 
    static JFrame creationWindow; 
    static JPanel creationPanel; 
    static JButton addObjectButton; 
    static JButton removeObjectButton; 
    static JButton finalizeRoomButton; 
    static JTextField classNameField; 
    static JTextField xSpawnField; 
    static JTextField ySpawnField; 
    static JTextField argument3Field; 
    static JTextField numberOfArgumentsField; 
    static JTextField roomNumberField; 
    static JTextField roomWidthField; 
    static JTextField roomHeightField; 

    public Room() 
    { 
    HashMap<Integer,ParentObject> ParentObjectMap = new HashMap();; 
    int roomNumber=0 ; 
    int width =0 ; 
    int height =0; 
    int idNumber =0; 
    } 
    static Object StringToObj (String name, Object[] argArray, int numArgs) 
    { 
     try 
     { 
     Class o = Class.forName(name); 
     Class argTypes[] = new Class[numArgs]; 
     //System.out.println("A"); 
     for(int I = 0; I<numArgs ; I ++) 
     { 
      argTypes[I] = Class.forName(argArray[I].getClass().getName());//.Type; 
      if (Class.forName(argArray[I].getClass().getName()) == Integer.class) 
      { 
       argTypes[I] = Integer.TYPE; 
      } 
      //System.out.println(argArray[I].getClass().getName()); 
     //argTypes[1] = Integer.TYPE; 
     } 
     Constructor constructor = o.getConstructor(argTypes); 
     //Object arguments[] = new Object[numArgs]; 
     //System.out.println("C"); 
     //arguments[0] = A; 
     //arguments[1] = B; 
     Object newObject = constructor.newInstance(argArray); 
     //System.out.println("D"); 
     return newObject; 
     } 

     catch(ClassNotFoundException cnfe) 
     { 
      System.out.println("Class not found exception "); 
      System.exit(1); 
     } 
     catch(NoSuchMethodException nsme) 
     { 
      System.out.println("No Such Method Exception"); 
      System.exit(1); 
     } 
     catch(InstantiationException instExcep) 
     { 
      System.out.println("Instantiation Exception"); 
      System.exit(1); 
     } 
     catch(IllegalAccessException iae) 
     { 
      System.out.println("Illegal Access Exception"); 
      System.exit(1); 
     } 
     catch(InvocationTargetException ite) 
     { 
      System.out.println("Invocation target exception"); 
      System.exit(1); 
     } 
     //so , sort through an array of all the sub classes of parent object, 
     //or maybe all the classes in the package, and test their getName 
     //against the argument until it comes out right, then return that class. 
     System.out.println("String to Obj is broken"); 
     return null; 
    } 
    class ActionClass implements ActionListener 
    { 
     public void actionPerformed (ActionEvent e) 
     { 
      if(e.getSource() == addObjectButton) 
      { 
       Object[] arguments = new Object[Integer.parseInt(numberOfArgumentsField.getText())]; 
       arguments[0] = Integer.parseInt(xSpawnField.getText()); 
       arguments[1] = Integer.parseInt(ySpawnField.getText()); 
       //arguments[2] = idNumber; 

       ParentObject placeHolder = (ParentObject)StringToObj("thegreatestrpgevermade." + 
         classNameField.getText(), arguments,Integer.parseInt(numberOfArgumentsField.getText())); 
       placeHolder.IDNUMBER = idNumber; 
       idNumber ++; 
       ParentObjectMap.put(new Integer(idNumber),placeHolder); 
       System.out.println("idnumber :" +placeHolder.IDNUMBER); 
      } 
      if(e.getSource() == removeObjectButton) 
      { 
       System.out.println(ParentObjectMap.get(0).spriteDirectory); 
       System.out.println("removeObjectButton Pressed");      
      } 
      if(e.getSource() == finalizeRoomButton) 
      { 
       try 
       { 
        roomNumber = Integer.parseInt(roomNumberField.getText()); 
        width = Integer.parseInt(roomWidthField.getText()); 
        height = Integer.parseInt(roomHeightField.getText()); 
        FileOutputStream fos = new FileOutputStream("C:\\thegreatestrpgevermade\\room" 
          + roomNumber +".ser"); 
        ObjectOutputStream oos = new ObjectOutputStream(fos); 
        System.out.println("Finalize: room line 152"); 
        oos.writeObject(room); 
        System.out.println("Finalize: room line 154"); 
        oos.flush(); 
        oos.close(); 
       } 
       catch(IOException ioe) 
       { 
        System.out.println("io exception room"); 
        System.exit(1); 
       } 
      } 
     } 
    } 
    public void InitializeCreationMode() 
    { 
     room = new Room(); 
     ParentObjectMap = new HashMap(); 
     actionClass = new ActionClass(); 
     creationWindow = new JFrame(); 
     creationPanel = new JPanel(); 
     addObjectButton = new JButton("Add Object"); 
     removeObjectButton = new JButton("Remove Object"); 
     finalizeRoomButton = new JButton("Finalize Room"); 
     classNameField = new JTextField("Class Name",20); 
     xSpawnField = new JTextField("X Coordinate(arg1)" , 20); 
     ySpawnField = new JTextField("Y Coordinate(arg2)" , 20); 
     argument3Field = new JTextField("Argument 3" , 20); 
     numberOfArgumentsField = new JTextField("Number Of Arguments" , 20); 
     roomNumberField = new JTextField("Room Number" , 20); 
     roomWidthField = new JTextField("Room Width" , 20); 
     roomHeightField = new JTextField("Room Height" , 20); 
     creationWindow.setSize(300,400); 
     creationWindow.setResizable(false); 
     creationWindow.setLocation(0,0); 
     creationWindow.add(creationPanel); 
     creationWindow.setDefaultCloseOperation(creationWindow.EXIT_ON_CLOSE); 
     creationPanel.setSize(300,400); 
     creationPanel.add(addObjectButton); 
     creationPanel.add(removeObjectButton); 
     creationPanel.add(finalizeRoomButton); 
     creationPanel.add(roomNumberField); 
     creationPanel.add(roomWidthField); 
     creationPanel.add(roomHeightField); 
     creationPanel.add(classNameField); 
     creationPanel.add(numberOfArgumentsField); 
     creationPanel.add(xSpawnField); 
     creationPanel.add(ySpawnField); 
     creationPanel.add(argument3Field); 
     addObjectButton.addActionListener(actionClass); 
     removeObjectButton.addActionListener(actionClass); 
     finalizeRoomButton.addActionListener(actionClass); 
     creationWindow.setVisible(true); 
     //im thinking ID numbers can't stay random. 
     //so basically, say HERO hits ENEMY. if ENEMY gets hit, it gives 
     //HERO its ID number which can be put into the hashmap to modify 
     // ENEMY'S health. 
    } 
    public void readExternal(ObjectInput in) 
    { 
     try 
     { 

      idNumber = in.readInt(); 
      width = in.readInt(); 
      height = in.readInt(); 
      roomNumber = in.readInt(); 
      // ParentObjectMap = (HashMap)in.readObject(); 
     } 
     catch(IOException ioe) 
     { 
      System.out.println(ioe.toString()); 
      ioe.printStackTrace(); 
     } 
     catch(ClassNotFoundException cnfe) 
     { 
      System.out.println("cnfe exception readExternal"); 
     } 
    } 
    public void writeExternal(ObjectOutput out) 
    { 
     try 
     { 
      System.out.println("Checkpoint 1 writeExternal"); 
      out.writeInt(idNumber); 
      System.out.println("Checkpoint 2 writeExternal: width:" + width); 
      out.writeObject(width); 
      System.out.println("Checkpoint 3 writeExternal : width:" + width); 
      out.writeInt(height); 
      System.out.println("Checkpoint 4 writeExternal"); 
      out.writeInt(roomNumber); 
      System.out.println("Checkpoint 5 writeExternal"); 
      //out.writeObject(ParentObjectMap); 
     } 
     catch(IOException ioe) 
     { 
      System.out.println(ioe.toString()); 
      ioe.printStackTrace(); 
     } 

    } 
    /*public static void main(String[] args) 
    { 
     room = new Room(); 
     room.InitializeCreationMode(); 
    }*/ 

} 

另一個類是MainClass。我包括相關的片段。反序列化EOF異常,序列化可能會寫入文件不正確

  FileInputStream fis = new FileInputStream("C:\\thegreatestrpgevermade\\room0.ser"); 
      ObjectInputStream ois = new ObjectInputStream(fis);   
      room = (Room)ois.readObject(); 
//   room = new Room(); 
      room.InitializeCreationMode(); 
      System.out.println("Room Width: " +room.width); 

堆棧跟蹤是這樣的:

java.io.EOFException 
at java.io.DataInputStream.readInt(DataInputStream.java:392) 
at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2820) 
at java.io.ObjectInputStream.readInt(ObjectInputStream.java:971) 
at thegreatestrpgevermade.Room.readExternal(Room.java:220) 
at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1837) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
at thegreatestrpgevermade.MainClass.main(MainClass.java:176) 

的初始化創建模式方法創建按鈕和字段 分配值寬度,高度等一的JWindow。操作類監聽它的按鈕 並且最終化按鈕序列化字段。序列化有些問題。在任何點打印出寬度爲零。我不知道爲什麼。

回答

0

假設問題是在你的標題中陳述的問題,答案是肯定的,該文件沒有被正確寫入。但你並不需要這一切。將其更改爲執行Serializable而不是Externalizable,並刪除和writeExternal()方法。