是否可以将包含BuffereImage的对象的ArrayList序列化为对象';java中的私有实例变量?
我正在尝试开发一个团队管理软件。我有一个团队目标:是否可以将包含BuffereImage的对象的ArrayList序列化为对象';java中的私有实例变量?,java,Java,我正在尝试开发一个团队管理软件。我有一个团队目标: public class Team implements Serializable{ private String name;// private ArrayList<Player> teamMembers;// private String sport;// private ArrayList<Staff> staff;//Non-Player Members such as head
public class Team implements Serializable{
private String name;//
private ArrayList<Player> teamMembers;//
private String sport;//
private ArrayList<Staff> staff;//Non-Player Members such as head coach, assisstant coach, physio, etc.
private Object schedule;
private String teamHometown;
private String teamState;
// Getter and setter methods go here
public Team(String name, String sport, ArrayList<Player> players, ArrayList<Staff> staff){
teamMembers = players;
this.staff = staff;
this.sport =(sport);
this.name = (name);
}
}
我的目标是序列化团队对象的arrayList,但是缓冲图像不可序列化,而且由于Player对象包含缓冲图像作为其私有实例变量之一,因此我无法序列化团队对象的arrayList
我最初尝试这样做:
ArrayList<Team> finalTeams = new ArrayList<>(SignInController.userTeams);//Converting the user teams Observable list to an Array List
//Saving the user's Teams locally
FileOutputStream fos = new FileOutputStream(SignInController.userfname+"'s Teams/"+SignInController.userfname+"_teams.xtm");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(finalTeams);//serializing the ARRAYlist of teams
oos.close();
fos.close();
ArrayList finalTeams=新的ArrayList(SignInController.userTeams)//将用户团队可观察列表转换为数组列表
//在本地保存用户的团队
FileOutputStream fos=新的FileOutputStream(SignInController.userfname+“'s Teams/”+SignInController.userfname+“_Teams.xtm”);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(最终目标)//序列化团队的ARRAYlist
oos.close();
fos.close();
然而,它没有起作用。我还试着研究与序列化缓冲图像相关的其他堆栈溢出问题,但没有任何帮助
如果有人能向我解释我做错了什么,那就太棒了!谢谢 根据javadocs
在序列化和
反序列化过程必须使用这些方法实现特殊的方法
确切签名:
因此,也许可以使用您自己的类扩展
buffereImage
,并实现上述方法是的,您可以,为什么不呢?!但我们将遵循非直的方法,它对我很有效
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
public class Member implements Serializable
{
private String name;
private byte[] imagebytes;
public Member(String name, BufferedImage image) throws IOException
{
this.name = name;
this.setImage(image);
}
public Member(String name, File imageFile) throws IOException
{
this.name = name;
this.setImage(imageFile);
}
public final void setImage(BufferedImage image) throws IOException
{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", outputStream);
this.imagebytes = outputStream.toByteArray();
}
public final void setImage(File imageFile) throws IOException
{
BufferedImage bufferedImage = ImageIO.read(imageFile);
this.setImage(bufferedImage);
}
public BufferedImage getImage()
{
try
{
return ImageIO.read(new ByteArrayInputStream(imagebytes));
} catch (Exception io)
{
return null;
}
}
public String getName()
{
return name;
}
}
您可以根据需要添加方法并自定义此类
我希望这个答案是有用的如果缓冲图像是可序列化的,你应该不会有任何问题,如果不是,这意味着只有当你将这个字段声明为“transient”时,你才能序列化这个对象(意思是-它不会被序列化,并且这个信息不会通过网络传递)是的我知道但那是我不想发生的。我想知道BuffereImage是否可以以某种方式序列化。谢谢好消息,兄弟,没什么,很乐意帮忙
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
public class Member implements Serializable
{
private String name;
private byte[] imagebytes;
public Member(String name, BufferedImage image) throws IOException
{
this.name = name;
this.setImage(image);
}
public Member(String name, File imageFile) throws IOException
{
this.name = name;
this.setImage(imageFile);
}
public final void setImage(BufferedImage image) throws IOException
{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", outputStream);
this.imagebytes = outputStream.toByteArray();
}
public final void setImage(File imageFile) throws IOException
{
BufferedImage bufferedImage = ImageIO.read(imageFile);
this.setImage(bufferedImage);
}
public BufferedImage getImage()
{
try
{
return ImageIO.read(new ByteArrayInputStream(imagebytes));
} catch (Exception io)
{
return null;
}
}
public String getName()
{
return name;
}
}