是否可以将包含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;
        }
    
    }