【问题标题】:Correctly serializing objects in java在java中正确序列化对象
【发布时间】:2014-01-26 16:26:47
【问题描述】:

谁能帮我找出错误?我试图通过序列化将某些信息(最小/最大/平均年龄)从文件 people.txt(由 200 行,如 'Christel ; MacKay ; 4"2' ; 38' )传递到另一个文件。 这是第一堂课,我在其中处理有关这些人的一些信息:

import java.io.Serializable;

    @SuppressWarnings("serial")
    public class Person implements Serializable
    {
         private String firstname;
         private String lastname;
         private int age;

     public Person (String PersonFN, String PersonLN, int PersonA)
     {
         firstname = PersonFN;
         lastname = PersonLN;
         age = PersonA;
     }

     public String toString()
     {
          return "Name: "+firstname+" "+lastname+" Age: "+age;

     }

     public int getAge()
     {
         return age;
     }

    }

还有一个,它可以完成所有工作:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.*;



public class Collection
{
    int min;
    int max;
    int total;

    private static ArrayList<Person> people;

    public Collection()
    {
        people = new ArrayList<Person>();
        min = 100;
        max = 1;
        total = 0;
    }

    BufferedReader fr = null;
    BufferedWriter fw = null;

    public void readFromFile() throws IOException
    {
        fr = new BufferedReader (new FileReader("people.txt"));
        String line = null;
        StringTokenizer st;
         while (fr.ready())
        {
            line = fr.readLine();
            st = new StringTokenizer(line);           
            String name = st.nextToken(";");
            String surname = st.nextToken(";").toUpperCase();
            String height = st.nextToken(";");
            int age =  Integer.parseInt(st.nextToken(";").trim());
            Person p = new Person (name, surname, age);
            p.toString();
            people.add(p);

            //for the 2nd part
            if(age < min)
                min = age;
            if (age > max)
                max = age;
            total = total + age;

        }

    }

    public int minAge()
    {
        int minA = 100;
        for (int i = 0; i < people.size(); i++)
        {
            Person p = people.get(i);
            int age = p.getAge();
            if (age < minA)
            {
                minA = age;

            }
        }
        System.out.print(minA+"; ");
        return minA;
    }

    public int maxAge()
    {
        int maxA = 1;
        for (int i = 0; i < people.size(); i++)
        {
            Person p = people.get(i);
            int age = p.getAge();
            if (age > maxA)
            {
                maxA = age;

            }
        }
        System.out.print(maxA+"; ");
        return maxA;
    }

    public float avgAge()
    {
        int sum = 0;
        for (int i = 0; i < people.size(); i++)
        {
            Person p = people.get(i);
            int age = p.getAge();
            sum = sum + age;
        }
        float avgA = sum / people.size();
        System.out.print(avgA);
        return avgA;


    }

    public int fastMinAge()
    {
        //System.out.print("Minimum age: " + min);
        return min;

    }

    public int fastMaxAge()
    {
        return max;
    }

     public float fastAvgAge()
     { 
         return total / people.size();
     }


    public void writeToFile(String filename) throws IOException
    {

         StringBuffer val = new StringBuffer ("Minimum age: ");
         val.append(fastMinAge());
         val.append("\n Maximum age: ");
         val.append(fastMaxAge());
         val.append("\n Average age: ");
         val.append(fastAvgAge());

         BufferedWriter out = new BufferedWriter(new FileWriter(filename));
         String outText = val.toString();
         out.write(outText);
         out.close();
    }


    public static void main(String[] args) throws IOException, ClassNotFoundException
    {
        Collection c = new Collection();
        c.readFromFile();

        for(Person d: people)
        {
            System.out.println(d);

        }
      c.minAge();
      c.maxAge();
      c.avgAge();
      c.fastMinAge();
      c.fastMaxAge();
      c.fastAvgAge();
      c.writeToFile("RESULTS.txt");

      String filename = "people.txt";
      //FileOutputStream fos = new FileOutputStream(filename);
      ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(filename));
      os.writeObject(c);
      os.close();

      String filename1 = "results1.txt";
      FileInputStream fis = new FileInputStream(filename1);
      ObjectInputStream ois = new ObjectInputStream(fis);
      Collection p = (Collection) ois.readObject();
      ois.close();

    }

}

当我运行代码时,它会创建 RESULTS.txt 文件并在其中添加正确的信息。我确定这部分代码有问题:

  String filename = "people.txt";
          //FileOutputStream fos = new FileOutputStream(filename);
          ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(filename));
          os.writeObject(c);
          os.close();

          String filename1 = "results1.txt";
          FileInputStream fis = new FileInputStream(filename1);
          ObjectInputStream ois = new ObjectInputStream(fis);
          Collection p = (Collection) ois.readObject();
          ois.close();

顺便说一句,我的 people.txt 文件更改为“¬ķ {sr java.io.NotSerializableException(Vx ē†5 xr java.io.ObjectStreamExceptiondĆäk¨9ūß xr java.io.IOExceptionl€sde%š« xr java .lang.ExceptionŠż>;Ä xr java.lang.ThrowableÕĘ5'9wøĖ L 导致 Ljava/lang/Throwable;L detailMessaget Ljava/lang/String;[ stackTracet [Ljava/lang/StackTraceElement;L suppressExceptionst Ljava/util/List;xpq ~ t SD3lab1.Collectionur [Ljava.lang.StackTraceElement;F*

Exception in thread "main" java.io.NotSerializableException: SD3lab1.Collection
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at SD3lab1.Collection.main(Collection.java:169)

非常感谢您的帮助

【问题讨论】:

  • Collection c = new Collection(); ???你为什么要实施收集?这是一个接口,你有很多可以使用的实现!
  • @OleksiyMartynov, c 来自“Collection c = new Collection();”,我以前用过,我绝对不确定如何进行序列化。它甚至在正确的类中吗?

标签: java object serialization


【解决方案1】:

您需要将Collection 标记为Serializable

public class Collection implements Serializable {

另外BufferedReaderBufferedWriter不可序列化所以需要标记为transient

private transient BufferedReader fr;
private transient BufferedWriter fw;

同样使用Collection这样的类名必然会引起混淆。考虑重命名类。

【讨论】:

  • 现在我在 java.io.FileInputStream.open(Native Method) 的 java.io.FileNotFoundException: results1.txt (The system cannot find the file specified) at java.io.FileInputStream.open(Native Method) .io.FileInputStream.(Unknown Source) at java.io.FileInputStream.(Unknown Source)”,并且人员文件像上次一样更改,它甚至没有创建“results1.txt” "文件。
  • 该程序从未写入文件results1.txt。你的意思是RESULTS.txt
  • 这里不是写了吗?字符串文件名1 = "results1.txt"; FileInputStream fis = new FileInputStream(filename1);
  • 实际上,您可以再次读取的唯一文件是people.txt - RESULTS.txt 已使用BufferedWriter 写入,因此与ObjectInputStream 不兼容
  • 我该如何创建那个“results1.txt”呢?顺便问一下,有人知道people文件的变化是什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多