简体   繁体   English

如何通过引用复制并反序列化Java中的对象列表?

[英]How to copy by reference and deserialize a list of objects in java?

So I am a beginner in Java and my professor has us doing this assignment and I've been looking around but I can't seem to find the right answer for my type of code. 因此,我是Java的初学者,我的教授让我们完成了这项任务,而且我一直在寻找,但是我似乎找不到适合我的代码类型的正确答案。 We had to create a class file and then a public class file to test it. 我们必须先创建一个类文件,然后再创建一个公共类文件来对其进行测试。

import java.io.Serializable;

public class Person implements Serializable {

    String Fname = new String();

    String MI = new String();

    String Lname = new String();

    String  age = new String();
    String gpa = new String();
//      int age = 20;

//      double gpa = 0.0;

    String Major = new String();

    String answer;


 //***********************************************
// The methods declared will go below 
// The first method is for the first name

public String getFname() {
   return Fname;
}

public void setFname(String Fname) {
       this.Fname = Fname;
    }


// This method is for the Middle Initial

public String getMI() {
   return MI;
}

 public void setMI(String MI) {
       this.MI = MI;
    }

// This method is for the Last name

public String getLname() {
       return Lname;    
}

    public void setLname(String Lname) {
       this.Lname = Lname;
    }

 // This method is for the Age

public String getAge() {
   return age;
}

public void setAge(String age) {
       this.age = age;
    }

// This method is for the GPA  

public String getGpa() {
   return gpa;
}

 public void setGpa(String gpa) {
       this.gpa = gpa;
    }

// This method is for the Major

public String getMajor() {
    return Major;
}
 public void setMajor(String Major) {
            this.Major = Major;
    }
}

The Person.java code is Serializable is supposed to be written to a fhm file and then Deserialized in order to print the contents of the file into terminal (Unix). Person.java代码是可序列化的,应该被写入fhm文件,然后反序列化以将文件的内容打印到终端(Unix)中。 Below is the main code which is the TestPerson code that will read the class Person code. 下面是主要代码,这是将读取类Person代码的TestPerson代码。

import java.util.Scanner;
import java.io.*;

public class TestPerson {

public static void main(String[] args) throws IOException, ClassNotFoundException { 


Person[] Peeps = new Person[3];
Peeps[0] = new Person();
Peeps[1] = new Person();
Peeps[2] = new Person();

Scanner scan = new Scanner(System.in);
String Answer = new String();
String age1 = new String();
String gpa1 = new String();

for (int i = 0; i < Peeps.length - 1; i++) {
//  for (int i = 0; i < 3; i++) {   

System.out.print("What is the First Name? ");
Answer = scan.nextLine();
Peeps[i].setFname(Answer);

System.out.print("What is MI? ");
Answer = scan.nextLine();
Peeps[i].setMI(Answer);

System.out.print(" What is Last Name? ");
Answer = scan.nextLine();
Peeps[i].setLname(Answer);

System.out.print(" What is the Age? ");
age1 = scan.nextLine();
int age = Integer.parseInt(age1);
//  age = scan.nextInt();
Peeps[i].setAge(age1);

System.out.print(" What is the GPA? ");
gpa1 = scan.nextLine();
double gpa = Double.parseDouble(gpa1);
Peeps[i].setGpa(gpa1);

System.out.print(" What is the Major? ");
Answer = scan.nextLine();
Peeps[i].setMajor(Answer);
}

for (int i = 0; i < 3; i++) {
System.out.print(Peeps[i]); 
}

try {
  FileOutputStream fileOut = new FileOutputStream("Peeps.fhm");
  ObjectOutputStream out = new ObjectOutputStream(fileOut);
  out.writeObject(Peeps);
  out.close();
  fileOut.close();
  System.out.println("\nSerialization Successful\n");

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

try { 
  FileInputStream fileIn = new FileInputStream("Peeps.fhm");
  ObjectInputStream in = new ObjectInputStream(fileIn);
  System.out.println("Deserialized Data: \n" + in.readObject().toString());
  in.close();
  fileIn.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
}
}

My professor wants me to prompt the user to enter data for two of the Person objects at the Terminal and then copy the reference to one of two populated Persons to the last Person. 我的教授希望我提示用户在终端上输入两个Person对象的数据,然后将对两个填充Person之一的引用复制到最后一个Person。 Then the program will write all three Persons to a disk file with the extension of ".fhm" (Which I have completed). 然后,程序会将所有三个“个人”写入到扩展名为“ .fhm”的磁盘文件中(已完成)。 My question is how do I copy the reference? 我的问题是如何复制参考? My second question is also how do I properly deserialize the file because when I run it, it works but the issue that pops up is that it tells me this: 我的第二个问题也是我如何正确反序列化该文件,因为当我运行它时,它可以工作,但是弹出的问题是它告诉我:

 Deserialized Data: [LPerson;@5e481248 

He wants it to print the information that was inputted by the user. 他希望它打印用户输入的信息。 I checked the fhm file that it writes to and it gathers all the information so I'm not sure what I'm doing wrong. 我检查了写入的fhm文件,它收集了所有信息,所以我不确定自己做错了什么。 Any help would be appreciated guys, sorry the post is kind of long. 任何帮助将不胜感激的家伙,对不起,这篇文章很长。 Thanks in advance. 提前致谢。

Your object is basically a Java array. 您的对象基本上是一个Java数组。 To print it out, you could use: 要打印出来,可以使用:

System.out.println("Deserialized Data: \n" + Arrays.toString(in.readObject()));

I'm not sure what you meant by the "copy the reference" part. 我不确定“复制参考”部分的含义。

The deserialization seems to be working well. 反序列化似乎运行良好。 But in your code you're effectively just calling .toString() to print an array, which is probably not what you want. 但是在您的代码中,您实际上只是在调用.toString()来打印数组,这可能不是您想要的。 You probably want to iterate over the items and print them one by one: 您可能想要遍历所有项目并逐一打印:

  FileInputStream fileIn = new FileInputStream("Peeps.fhm");
  ObjectInputStream in = new ObjectInputStream(fileIn);
  Person[] peeps = in.readObject();
  System.out.println("Deserialized Data:");
  for (Person person : peeps) { 
      System.out.printf("First Name: %s MI: %s Last Name: %s%n", 
          person.getFname(), person.getMI(), person.getLname()); 
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM