如何序列化包含 java 中对象的对象?
How can I serialize object containing objects in java?
在我们的学期项目中,我们负责制作桌游的桌面版。我的角色是实现保存和加载方法。为此,我致力于连载。我正在尝试序列化包含其他对象的对象。为了形象化,我准备了一些示例 classes.
import java.io.Serializable;
public class Player implements Serializable
{
static int id;
static String name;
public Player(String name)
{
this.name = name;
}
}
import java.io.Serializable;
public class Team implements Serializable
{
String name;
transient Player c;
int[] numbers;
public Team(String name, String capt){
this.name = name;
this.c = new Player(capt);
}
public Player getC()
{
return c;
}
public String getName()
{
return name;
}
}
public class test implements Serializable
{
public static void main(String args[])throws IOException
{
Team t1 = new Team("Juventus", "Ronaldo");
Team t2 = new Team("Barcelona", "Messi");
File file = createSave("1");
save(file,t1,t2);
Team[] teams = load(file);
System.out.println("Team 1 is: " + teams[0].getName());
System.out.println("Team 2 is: " + teams[1].getName());
System.out.println("Captain of team 1 is: " + teams[0].getC().name);
System.out.println("Captain of team 2 is: " + teams[1].getC().name);
}
private static File createSave(String gameId) throws IOException
{
File file = new File(gameId + ".txt");
if (file.createNewFile())
{
System.out.println("File is created!");
}
else
{
System.out.println("File already exists.");
}
return file;
}
private static void save(File file, Team t1, Team t2)throws IOException
{
FileOutputStream f = new FileOutputStream(file);
ObjectOutputStream o = new ObjectOutputStream(f);
o.writeObject(t1);
o.writeObject(t2);
o.close();
f.close();
}
private static Team[] load(File file)throws IOException
{
try {
Team[] teams = new Team[2];
FileInputStream fi = new FileInputStream(file);
ObjectInputStream oi = new ObjectInputStream(fi);
Team team1 = (Team) oi.readObject();
Team team2 = (Team) oi.readObject();
teams[0] = team1;
teams[1] = team2;
oi.close();
fi.close();
return teams;
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
总结代码部分:我创建了一个球员 class 和一个包含球员对象的球队 class。在class队中,有一种方法是return担任队长。我创建了两个球队实例,第一个是尤文图斯,队长是罗纳尔多。第二个是巴萨,队长是梅西。然后我使用 ObjectOutputStream 将这两个团队对象存储到一个 txt 文件中。在加载方法中,我通过使用 ObjectInputStream 和 return 将它们作为数组加载了两个团队。
当我尝试访问两个团队对象的名称变量时,我可以。但是,我无法联系到球队的队长。只有最后创建的播放器对象可用。让我分享我的输出:
文件已经存在。
1 队是:尤文图斯
第 2 队是:巴塞罗那
1队队长是:梅西
2队队长是:梅西
如输出所示,我只能到达最后创建的内部对象。球员罗纳尔多现在迷路了。
如果你能帮助我,我会很高兴。
我总是推荐 GSON 来序列化和反序列化对象。看看吧:)
嗯,首先你需要练习并了解更多 java 的基础知识。
您所做的错误是在 class 播放器中。您将名称设置为静态字段。所有玩家只能有一个名字。
试试这样替换你class:
import java.io.Serializable;
public class Player implements Serializable {
private int id;
private String name;
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
团队 class 的下一个只是删除瞬态
Player c;
并且主要class使用
System.out.println("Captain of team 1 is: " + teams[0].getC().getName());
System.out.println("Captain of team 2 is: " + teams[1].getC().getName());
现在您的代码应该可以工作了:)它并不完美,但这应该可以解决您的问题
在我们的学期项目中,我们负责制作桌游的桌面版。我的角色是实现保存和加载方法。为此,我致力于连载。我正在尝试序列化包含其他对象的对象。为了形象化,我准备了一些示例 classes.
import java.io.Serializable;
public class Player implements Serializable
{
static int id;
static String name;
public Player(String name)
{
this.name = name;
}
}
import java.io.Serializable;
public class Team implements Serializable
{
String name;
transient Player c;
int[] numbers;
public Team(String name, String capt){
this.name = name;
this.c = new Player(capt);
}
public Player getC()
{
return c;
}
public String getName()
{
return name;
}
}
public class test implements Serializable
{
public static void main(String args[])throws IOException
{
Team t1 = new Team("Juventus", "Ronaldo");
Team t2 = new Team("Barcelona", "Messi");
File file = createSave("1");
save(file,t1,t2);
Team[] teams = load(file);
System.out.println("Team 1 is: " + teams[0].getName());
System.out.println("Team 2 is: " + teams[1].getName());
System.out.println("Captain of team 1 is: " + teams[0].getC().name);
System.out.println("Captain of team 2 is: " + teams[1].getC().name);
}
private static File createSave(String gameId) throws IOException
{
File file = new File(gameId + ".txt");
if (file.createNewFile())
{
System.out.println("File is created!");
}
else
{
System.out.println("File already exists.");
}
return file;
}
private static void save(File file, Team t1, Team t2)throws IOException
{
FileOutputStream f = new FileOutputStream(file);
ObjectOutputStream o = new ObjectOutputStream(f);
o.writeObject(t1);
o.writeObject(t2);
o.close();
f.close();
}
private static Team[] load(File file)throws IOException
{
try {
Team[] teams = new Team[2];
FileInputStream fi = new FileInputStream(file);
ObjectInputStream oi = new ObjectInputStream(fi);
Team team1 = (Team) oi.readObject();
Team team2 = (Team) oi.readObject();
teams[0] = team1;
teams[1] = team2;
oi.close();
fi.close();
return teams;
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
总结代码部分:我创建了一个球员 class 和一个包含球员对象的球队 class。在class队中,有一种方法是return担任队长。我创建了两个球队实例,第一个是尤文图斯,队长是罗纳尔多。第二个是巴萨,队长是梅西。然后我使用 ObjectOutputStream 将这两个团队对象存储到一个 txt 文件中。在加载方法中,我通过使用 ObjectInputStream 和 return 将它们作为数组加载了两个团队。
当我尝试访问两个团队对象的名称变量时,我可以。但是,我无法联系到球队的队长。只有最后创建的播放器对象可用。让我分享我的输出:
文件已经存在。
1 队是:尤文图斯
第 2 队是:巴塞罗那
1队队长是:梅西
2队队长是:梅西
如输出所示,我只能到达最后创建的内部对象。球员罗纳尔多现在迷路了。 如果你能帮助我,我会很高兴。
我总是推荐 GSON 来序列化和反序列化对象。看看吧:)
嗯,首先你需要练习并了解更多 java 的基础知识。 您所做的错误是在 class 播放器中。您将名称设置为静态字段。所有玩家只能有一个名字。
试试这样替换你class:
import java.io.Serializable;
public class Player implements Serializable {
private int id;
private String name;
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
团队 class 的下一个只是删除瞬态
Player c;
并且主要class使用
System.out.println("Captain of team 1 is: " + teams[0].getC().getName());
System.out.println("Captain of team 2 is: " + teams[1].getC().getName());
现在您的代码应该可以工作了:)它并不完美,但这应该可以解决您的问题