data[] pdata = (data[])in.readObject();
这行不对啊对象序列化怎么可能会序列出一个数组呢???/*改正后*/package com.oss.checkaccount;import java.io.Serializable;
public class data implements Serializable{  public String str="nihaoma";
  public String str2="yumen,ceshi";
  public data() {
  }
}
package com.oss.checkaccount;import java.util.*;
import java.io.*;public class test {
  public test() {
  }  private String Datechange() {
    Calendar temp = Calendar.getInstance();
    String strtmp = ".\\log\\";
    strtmp += temp.get(Calendar.YEAR);
    strtmp += (temp.get(Calendar.MONTH) + 1);
    strtmp += temp.get(Calendar.DAY_OF_MONTH);
    strtmp += ".txt";
    return strtmp;
  }  public boolean WriteObjectToFile() {
    try {
      ObjectOutputStream out = new ObjectOutputStream(
          new FileOutputStream(Datechange(), true));
      data pdate = new data();
      out.writeObject(pdate);
      out.close();
    }
    catch (InvalidClassException ic) {
      System.out.println("InvalidClassException");
      ic.getStackTrace();
    }
    catch (NotSerializableException ns) {
      System.out.println("NotSerializableException");
      ns.getStackTrace();
    }
    catch (IOException ioEx) {
      ioEx.getStackTrace();
    }
    return true;
  }  public boolean ReadObjectToFile() {
    ObjectInputStream in = null;
    try {
      in = new ObjectInputStream(
          new FileInputStream(Datechange()));
      data pdata = (data) in.readObject();
      System.out.println(pdata.str);
      System.out.println(pdata.str2);
      in.close();
    }
    catch (InvalidClassException ic) {
      System.out.println("InvalidClassException");
      ic.getStackTrace();
    }
    catch (ClassNotFoundException ns) {
      System.out.println("ClassNotFoundException");
      ns.getStackTrace();
    }
    catch (StreamCorruptedException sce) {
      System.out.println("StreamCorruptedException");
      sce.getStackTrace();
    }
    catch (OptionalDataException ode) {
      System.out.println("StreamCorruptedException");
      ode.getStackTrace();
    }
    catch (IOException ioEx) {
      System.out.println(ioEx.getMessage());
      ioEx.printStackTrace();
      try {
        in.close();
      }
      catch (Exception ex) {
        System.out.println("close error!");
      }
    }    return true;
  }  public static void main(String args[]) {
    test ptest = new test();
    ptest.WriteObjectToFile();
    ptest.ReadObjectToFile();
  }
}

解决方案 »

  1.   

    sboom(+-LingCh-+)(对不起,爱上你) 呵呵,贴代码的意思就是你粘贴过去,微小的改动就可以调试了,乱是乱了点。呵呵。
    对了,zncn2(Zn(CN)2) 兄,如果存储了n个对象是不是我只能一个一个的读出来:例如可以这样写伪代码:
    List plist = new ArrayList();
    while(!feof(fp)){
       plist.add((data) in.readObject());
    }
    而不能data[] pdata = (data[])in.readObject();
    我看网上有个例子是这样写的。
    有没有更好的办法呢,讨论一下吧,下班前就揭帖。。
      

  2.   

    但是有一点你得注意,由于你采用了追加式的写文件,所以每次都会写进一个4字节的序列化版本号,所以每读一个对象就得向后跳4个字节,否则会报错,例程序如下:
          FileInputStream filein = new FileInputStream(Datechange());
          ObjectInputStream in = new ObjectInputStream(filein);
          List plist = new ArrayList();
          while(filein.available() != 0){
            plist.add(in.readObject());
            /*跳过4字节的版本信息*/
            if(filein.available()!=0)
              filein.skip(4);
          }
          for(int i=0;i<plist.size();++i){
            data pdata = (data)plist.get(i);
            System.out.println(pdata.str);
            System.out.println(pdata.str2);
          }
          in.close();
      

  3.   

    如果是重新写入时系统会自动加入0xac,0xed,两字节版本号,所以每次只需读入两个字节判断一下是否为0xac,0xed就行了,例程如下:
    FileInputStream filein = new FileInputStream(Datechange());
          ObjectInputStream in = new ObjectInputStream(filein);
          List plist = new ArrayList();
          while(filein.available() != 0){
            plist.add(in.readObject());
            /*跳过4字节的版本信息*/
            if(filein.available()!=0)
              filein.skip(4);
          }
          for(int i=0;i<plist.size();++i){
            data pdata = (data)plist.get(i);
            System.out.println(pdata.str);
            System.out.println(pdata.str2);
          }
          in.close();
      

  4.   

    对不起不小心贴错了,应该是
          while(filein.available() != 0){
            plist.add(in.readObject());
            if(filein.available()!=0){
              if(filein.read() == 0xac && filein.read() == 0xed)
                 filein.skip(2);
              else
                 filein.skip(-1);  //回跳
            }
          }
      

  5.   

    看看这个吧,是Sun对序列化的格式解释,应该有点帮助ftp://ftp.java.sun.com/docs/j2se1.4/serial-spec.pdf