首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当我通过writeObject方法发送一个对象时,为什么它没有改变?

当我通过writeObject方法发送一个对象时,为什么它没有改变?
EN

Stack Overflow用户
提问于 2016-12-09 10:43:09
回答 1查看 948关注 0票数 2

我正在用Java做网络程序。作为标题,服务器试图发送的对象在接收它的客户端中被更改。在从服务器接收新的对象之前,我正在尝试更改客户端中存在的对象。这是我的代码。第一个是Server.sendIdea,第二个是Client.rcvIdea。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void sendIdea(Idea _idea) throws IOException {
    objectOS.flush();
    Idea idea = _idea;
//when I look into 'idea' it's fine
    objectOS.writeObject(idea);
}

。。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Idea rcvIdea(int _ideaCode) throws ClassNotFoundException, IOException {
    objectOS.writeObject("sendIdea");
    objectOS.writeObject(_ideaCode);
    Idea returnValue = (Idea) objectIS.readObject();
//when I look into 'returnValue', it is not the one 'sendIdea' has sent.
    return returnValue;
}

如您所见,sendIdea(Idea _idea)使用writeObject方法从类Idea发送一个对象。rcvIdea()使用readObject()方法接收对象。(我相信您不必详细了解Idea类)。客户端实际上通过这种方法在程序开始时收到了一些Idea,没有任何问题。但是,当我尝试通过这个方法接收相同但稍微改变的对象Idea时,在Client类中,对象不会改变,不像在Server类中,由sendIdea方法发送的对象被正确地改变。我尝试了大约5个小时来解决这个问题。我逐行检查了所有的代码,什么也没找到。我非常确定writeObject或readObject方法有问题。我尝试了objectOS.flush(),以明确流和许多其他试验。我希望我能找到问题所在。下面是我的程序中的一些代码

Client.class包ideaOcean;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.awt.HeadlessException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import data.Idea;
import data.Opinion;
import data.Profile;

public class Client {
Socket socket;
OutputStream os;
ObjectOutputStream objectOS;
InputStream is;
ObjectInputStream objectIS;
MainWindow mainWindow;

int idCode;
String email, password;
Profile myProfile;
ArrayList<Idea> myIdeas;
ArrayList<Opinion> myOpinions;
ArrayList<Integer> newIdeasCodes, hotIdeasCodes;
ArrayList<Idea> newIdeas, hotIdeas;

String command;

static final String SERVER_IP = "127.0.0.1";// 
static final int SERVER_PORT_NUM = 5000;

public static void main(String[] args) {
    Client client = new Client();
    client.mainWindow = new MainWindow();

    client.mainWindow.setVisible(true);

    client.mainWindow.showLoginPg();
    try {
        while (!client.loginCheck()) {// login
            continue;
        }
    } catch (HeadlessException | NumberFormatException | ClassNotFoundException | IOException e) {
        e.printStackTrace();
    }
    System.out.println("[login complete]");

    try {
        client.myProfile = client.rcvProfile(client.idCode);// get myProfile
        int i;
        for (i = 0; i < client.myProfile.myIdeaCode.size(); i++) {
            client.myIdeas.add(client.rcvIdea(client.myProfile.myIdeaCode.get(i)));
        }
        for (i = 0; i < client.myProfile.myOpinionCode.size(); i++) {
            client.myOpinions.add(client.rcvOpinion(client.myProfile.myOpinionCode.get(i)));
        }
        // ***************************
    } catch (ClassNotFoundException | IOException e1) {
        e1.printStackTrace();
    }

    try {
        client.rcvNewIdeas(12);
        client.mainWindow.newOcean.floatingIdeas = client.newIdeas;
        client.mainWindow.newOcean.arrangeFloatingPanels();

        client.rcvHotIdeas(12);
        client.mainWindow.hotOcean.floatingIdeas = client.hotIdeas;
        client.mainWindow.hotOcean.arrangeFloatingPanels();
    } catch (ClassNotFoundException | IOException e) {
        e.printStackTrace();
    }

    client.mainWindow.setMyPg(client.myProfile, client.myIdeas, client.myOpinions);
    client.mainWindow.showMainPg();

    client.start();
}

public Client() {
    try {
        socket = new Socket(SERVER_IP, SERVER_PORT_NUM);

        System.out.println("Connected to Server!");

        os = socket.getOutputStream();
        objectOS = new ObjectOutputStream(os);
        is = socket.getInputStream();
        objectIS = new ObjectInputStream(is);

        myIdeas = new ArrayList<>();
        myOpinions = new ArrayList<>();
        newIdeasCodes = new ArrayList<>();
        hotIdeasCodes = new ArrayList<>();
        newIdeas = new ArrayList<>();
        hotIdeas = new ArrayList<>();

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

void start() {
    while (true) {
        try {
            if (mainWindow.newBtnClicked) {
                rcvNewIdeas(12);
                mainWindow.newOcean.floatingIdeas = newIdeas;
                mainWindow.newOcean.arrangeFloatingPanels();
                mainWindow.newBtnClicked = false;
            } else if (mainWindow.hotBtnClicked) {
                rcvHotIdeas(12);
                mainWindow.hotOcean.floatingIdeas = hotIdeas;
                mainWindow.hotOcean.arrangeFloatingPanels();
                mainWindow.hotBtnClicked = false;
            } else if (mainWindow.newOcean.detailBtnClicked) {

                updateIdeaDetailFrame(mainWindow.newOcean.clickedIdea);
                mainWindow.newOcean.detailBtnClicked = false;

            } else if (mainWindow.hotOcean.detailBtnClicked) {

                updateIdeaDetailFrame(mainWindow.hotOcean.clickedIdea);
                mainWindow.hotOcean.detailBtnClicked = false;

            } else if (mainWindow.ideaDetailFrame.saveOpinionBtnClicked) {

                sendOpinion(mainWindow.ideaDetailFrame.newOpinion);
                updateIdeaDetailMainPanel(rcvIdea(mainWindow.ideaDetailFrame.idea.ideaCode));
                mainWindow.ideaDetailFrame.saveOpinionBtnClicked = false;

            } else if (mainWindow.writeIdeaPg.postIdeaBtnClicked) {

                sendIdea(mainWindow.writeIdeaPg.thisIdea);
                mainWindow.writeIdeaPg.postIdeaBtnClicked = false;

            } else if (mainWindow.newOcean.plusBtnClicked) {

                objectOS.writeObject("plusBtnClicked");
                objectOS.writeObject(mainWindow.newOcean.plusMinusClickedIdeaCode);
                mainWindow.newOcean.plusBtnClicked = false;

            } else if (mainWindow.newOcean.minusBtnClicked) {

                objectOS.writeObject("minusBtnClicked");
                objectOS.writeObject(mainWindow.newOcean.plusMinusClickedIdeaCode);
                mainWindow.newOcean.minusBtnClicked = false;

            } else if (mainWindow.hotOcean.plusBtnClicked) {

                objectOS.writeObject("plusBtnClicked");
                objectOS.writeObject(mainWindow.hotOcean.plusMinusClickedIdeaCode);
                mainWindow.hotOcean.plusBtnClicked = false;

            } else if (mainWindow.hotOcean.minusBtnClicked) {

                objectOS.writeObject("minusBtnClicked");
                objectOS.writeObject(mainWindow.hotOcean.plusMinusClickedIdeaCode);
                mainWindow.hotOcean.minusBtnClicked = false;

            } else if (mainWindow.myBtnClicked) {

                mainWindow.setMyPg(myProfile, myIdeas, myOpinions);
                mainWindow.myBtnClicked = false;
            }
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }
    }
}

int i = 0;

Idea rcvIdea(int _ideaCode) throws ClassNotFoundException, IOException {
    objectOS.writeObject("sendIdea");
    objectOS.writeObject(_ideaCode);
    Idea returnValue = (Idea) objectIS.readObject();
    return returnValue;
}

Opinion rcvOpinion(int _opinionCode) throws ClassNotFoundException, IOException {
    objectOS.writeObject("sendOpinion");
    objectOS.writeObject(_opinionCode);
    return (Opinion) objectIS.readObject();
}

Profile rcvProfile(int _idCode) throws IOException, ClassNotFoundException {
    objectOS.writeObject("sendProfile");
    objectOS.writeObject(_idCode);
    return (Profile) objectIS.readObject();
}

void rcvNewIdeasCodes() throws ClassNotFoundException, IOException {
    objectOS.writeObject("sendNewIdeasCodes");
    newIdeasCodes = (ArrayList<Integer>) objectIS.readObject();
}

void rcvHotIdeasCodes() throws IOException, ClassNotFoundException {
    objectOS.writeObject("sendHotIdeasCodes");
    hotIdeasCodes = (ArrayList<Integer>) objectIS.readObject();
}

void rcvNewIdeas(int num) throws ClassNotFoundException, IOException {
    int i;
    rcvNewIdeasCodes();
    newIdeas = new ArrayList<>();
    if (num <= newIdeasCodes.size()) {
        for (i = 0; i < num; i++) {
            newIdeas.add(rcvIdea(newIdeasCodes.get(i)));
        }
    } else {
        for (i = 0; i < newIdeasCodes.size(); i++) {
            newIdeas.add(rcvIdea(newIdeasCodes.get(i)));
        }
    }
}

void rcvHotIdeas(int num) throws ClassNotFoundException, IOException {
    int i;
    rcvHotIdeasCodes();
    hotIdeas = new ArrayList<>();
    if (num <= hotIdeasCodes.size()) {
        for (i = 0; i < num; i++) {
            hotIdeas.add(rcvIdea(hotIdeasCodes.get(i)));
        }
    } else {
        for (i = 0; i < hotIdeasCodes.size(); i++) {
            hotIdeas.add(rcvIdea(hotIdeasCodes.get(i)));
        }
    }
}

void sendIdea(Idea _idea) throws IOException {
    objectOS.writeObject("rcvIdea");
    objectOS.writeObject(_idea);
}

void sendOpinion(Opinion _opinion) throws IOException {
    objectOS.writeObject("rcvOpinion");
    objectOS.writeObject(_opinion);
}

void sendProfile(Profile _profile) throws IOException {
    objectOS.writeObject(_profile);
}

boolean loginCheck() throws HeadlessException, NumberFormatException, IOException, ClassNotFoundException {
    objectOS.writeObject("loginCheck");// send command

    while (!mainWindow.loginBtnClicked) {
        continue;
    }
    mainWindow.loginBtnClicked = false;

    email = mainWindow.emailField.getText().trim();
    password = mainWindow.passwordField.getText().trim();
    objectOS.writeObject(email);
    objectOS.writeObject(password);

    boolean valid;
    valid = (boolean) objectIS.readObject();
    if (valid == false) {
        JOptionPane.showMessageDialog(mainWindow, "ID or Password is not correct");
        mainWindow.emailField.setText("");
        mainWindow.passwordField.setText("");
        return false;
    } else if (valid == true) {
        idCode = (int) objectIS.readObject();
        return true;
    } else {
        return false;
    }
}

void updateIdeaDetailMainPanel(Idea clickedIdea) throws ClassNotFoundException, IOException {
    ArrayList<Opinion> opinions = new ArrayList<>();
    for (int j = 0; j < clickedIdea.opinionCode.size(); j++) {
        opinions.add(rcvOpinion(clickedIdea.opinionCode.get(j)));
    }
    mainWindow.ideaDetailFrame.updateMainPanel(opinions);
}

void updateIdeaDetailFrame(Idea clickedIdea) throws ClassNotFoundException, IOException {
    ArrayList<Opinion> opinions = new ArrayList<>();
    for (int j = 0; j < clickedIdea.opinionCode.size(); j++) {
        opinions.add(rcvOpinion(clickedIdea.opinionCode.get(j)));
    }
    mainWindow.ideaDetailFrame = new IdeaDetailFrame(clickedIdea, opinions);
    mainWindow.ideaDetailFrame.setVisible(true);
}
}

Idea.class包数据;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;

public class Idea implements Serializable {

private static final long serialVersionUID = 123123L;
public int idCode;
public int ideaCode;

public int plus = 0, minus = 0;

public String ideaName;
public String oneLineExp;
public String explanation;
public ArrayList<Integer> opinionCode;
public Date date;
public MyCanvas image;

int hotDegree;

public Idea(int _idCode,int _ideaCode, String _ideaName, String _oneLineExp, String _explanation, MyCanvas _image) {
    this(_idCode,_ideaName,_oneLineExp,_explanation,_image);
    ideaCode = _ideaCode;

}

public Idea(int _idCode, String _ideaName, String _oneLineExp, String _explanation, MyCanvas _image) {
    this(_idCode,_ideaName,_oneLineExp,_explanation);
    image = _image;
}

public Idea(int _idCode, String _ideaName, String _oneLineExp, String _explanation){
    idCode = _idCode;
    oneLineExp = new String(_oneLineExp);
    ideaName = new String(_ideaName);
    explanation = new String(_explanation);
    date = new Date();
    opinionCode = new ArrayList<>();
}

public void saveIdea() {
    FileOutputStream fos = null;
    ObjectOutputStream oos = null;

    try {
        fos = new FileOutputStream("Idea.dat");
        oos = new ObjectOutputStream(fos);

        oos.writeObject(this);
    } catch (IOException e1) {
        System.out.println("e1");
    }
}

void addOpinionCode(int _opinion) {
    opinionCode.add(opinionCode.size(), _opinion);
}

public void incPlus() {
    plus++;
}

public void incMinus() {
    minus++;
}

public int setHotDegree() {
    hotDegree = plus - minus + opinionCode.size() * 2;
    return hotDegree;
}

}

Opinion.class

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package data;

import java.io.Serializable;
import java.util.Date;

public class Opinion implements Serializable{
int idCode;
public int opinionCode;//the intrinsic code of this opinion

public int commentedIdeaCode;
public String opinion;
public Date date;
int plus, minus;

public Opinion(int _idCode,int _commentedIdeaCode, String _opinion){
    idCode = _idCode;
    commentedIdeaCode = _commentedIdeaCode;
    opinion = new String(_opinion);
    date = new Date();
    plus = 0;
    minus = 0;
}// Opinion(int _idCode,int _commentedIdeaCode, String _opinion)

public Opinion(int _idCode,int _opinionCode,int _commentedIdeaCode, String _opinion){
    this(_idCode, _commentedIdeaCode, _opinion);
    opinionCode = _opinionCode;
}//Opinion(int _idCode,int _opinionCode,int _commentedIdeaCode, String _opinion)

void incPlus(){
    plus++;
}

void incMinus(){
    minus++;
}
}
EN

回答 1

Stack Overflow用户

发布于 2016-12-12 10:30:08

ObjectOutputStream创建所有已序列化对象的图形,并使用对先前序列化对象的引用。因此,当您多次序列化Idea实例时,每次在第一次序列化之后,都会写入对第一次序列化的引用,而不是整个对象。

您可以在每次序列化之后使用ObjectOutputStream.reset()。这将丢弃对象图,并强制ObjectOutputStream创建新的对象序列化,即使是以前见过的对象也是如此。

因此,您的sendIdea方法应该如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void sendIdea(Idea _idea) throws IOException {
    objectOS.flush();
    objectOS.reset();

    Idea idea = _idea;
    objectOS.writeObject(idea);
}

非常重要的是,请注意,在reset()之后,所有对象引用都会重新序列化。因此,如果你有一个复杂的对象图,你可能会在反序列化后得到重复的对象。

如果您希望为要多次序列化的对象共享可传递引用,请改为查看ObjectOutputStream.writeUnshared()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41058548

复制
相关文章
当我们谈VR时,一定不会错过它
如今,整个资本市场对VR的狂热程度似乎略“魔怔”。据调查,在今年3月的其中1周时间内,VR市场所获得的投资额高达11亿美金,这比VR市场在15年全年所获得投资额还要高。所以说,“2016年将会成为VR
镁客网
2018/05/28
3630
为什么要在addsubview:一个view对象后,release它
为什么imgView要release呢?可能很多人跟我一样,之前不是很清楚。 我们逐行分析一下
EltonZheng
2021/01/22
3990
当我们和计算机交互时,它看到的是什么?
计算机虽然有了人工智能的程序支持,但事实上也不能将其机器学习的功能等同于像人类那样。至少,到目前还不是这样。那么,向Google的图片识别或者Facebook的M应用等一类系统,它们是怎么能够理解自然
新智元
2018/03/13
6640
当我们和计算机交互时,它看到的是什么?
ios objc向一个对象发送消息时,发生了什么?
根据对象的isa指针找到该对象所属的类,去obj的对应的类中找方法 1.首先,在相应操作的对象中的缓存方法列表中找调用的方法,如果找到,转向相应实现并执行。 2.如果没找到,在相应操作的对象中的方法列表中找调用的方法,如果找到,转向相应实现执行 3.如果没找到,去父类指针所指向的对象中执行1,2. 4.以此类推,如果一直到根类还没找到,转向拦截调用,走消息转发机制。 5.如果没有重写拦截调用的方法,程序报错。
赵哥窟
2018/09/13
1.8K0
ios objc向一个对象发送消息时,发生了什么?
当我们在谈免费游戏时
技术改变思想 本来不想用“当我们在谈XXX的时候,我们在谈什么”这种俗气的标题,但这个文章的内容,确实在一些人的想法里,还是有那么一点俗气的。所以用这个标题,也算文题对应吧。免费游戏,道具收费(Free To Play)作为一种游戏类型的存在,似乎是一个最近10年才开始的事情,但在中国,这种类型几乎成为了唯一的游戏类型。一切产品,都是因为有用户的市场需求才会存在,但是免费游戏这个市场,又是如何被挖掘出来的呢?——这对于看清楚免费游戏背后的用户需求,应该是有很多好处的。 2006年的某天,我的老板给我打了个
韩伟
2018/03/05
2.3K1
当我们在谈免费游戏时
一个好像没有做任何改变的参数
实际上就是一行命令在运行比对过程,但是呢,参数太多了,调起来很麻烦,通常如果不理解的话就不建议修改参数。
生信技能树
2019/11/06
1.5K0
一个好像没有做任何改变的参数
当我们没有加减乘除之后
当我们看到无法使用加法和减法的时候,我们的第一印象应该就是想着转化思维,去思考计算机的底层到底是什么运算呢?
鹏-程-万-里
2020/03/19
4880
当我们没有加减乘除之后
为什么都说学C语言都是没有对象的?
首先介绍一下C语言:C语言是一门面向过程的、抽象化的通语言,主要应用于底层开发,例如强悍的Linux操作系统,以及最近比较火的Python都是C语言编写的。
小林C语言
2020/04/02
1.7K0
当我们谈注册中心时谈什么?
注册中心对于服务提供者需要具备服务注册、注销的能力,对于服务消费者需要提供查询服务、感知服务变化的功能。当然还需要解决一些其他问题才能成为一个优秀的注册中心,如高可用、高性能、水平扩展能力、服务探活能力、路由功能、多机房(多活)能力等。
龟仙老人
2020/12/16
6020
批量单聊消息发送时,没有返回发送失败的账户和错误码,不回调
我要向(“a”, "b")两个个用户发送批量单聊消息,如果a账户存在(已登录过IM或已导入),而b账户不存在,通过REST API发送,并没有返回b发送失败的信息,而是返回OK,并没有文档中所说的ErrorList字段,如下
用户6968426
2020/02/19
2.5K1
批量单聊消息发送时,没有返回发送失败的账户和错误码,不回调
如何通过反射调用对象的方法?
import java.lang.reflect.Method; class MethodInvokeTest { public static void main(String[] args) throws Exception { String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str));
唐怀瑟
2018/08/30
2.9K0
当我尝试着把老项目 Webpack 迁移到 Vite 时,发现并没有这么香
最近,就 前端开发过程中的痛点及可优化项 做了一次收集。 其中,构建耗时、项目编译速度慢 的字眼出现了好几次。
用户3806669
2021/04/29
13.4K1
当我尝试着把老项目 Webpack 迁移到 Vite 时,发现并没有这么香
java在调用System.out.println()打印一个新new的对象时,为什么会调用toString方法?
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
Fisherman渔夫
2019/07/31
1.5K0
java在调用System.out.println()打印一个新new的对象时,为什么会调用toString方法?
C#new一个对象时
问题看似简单,不过事实上,CLR做的比这要多。。。 要准确回答这个问题,还要分情况来说。
vv彭
2020/10/27
6800
当我们谈部署时,我们在谈什么?
计算机网络把各地的计算机连接了起来,只要有一台可以上网的终端,比如手机、电脑,就可以访问互联网上任何一台服务器的资源(包括静态资源和动态的服务)。
神说要有光zxg
2022/04/12
6180
当我们谈部署时,我们在谈什么?
当我们谈论内容时,我们在谈什么?
作为数字音乐界『双App』之一的虾米音乐迎来了一个爆款内容:《我的少女时代》主题曲《小幸运》在虾米音乐播放量超过三千万,这首由田馥甄演唱的歌,在数字音乐平台的表现很是亮眼,虾米音乐则凭这一爆款内容在用户获取等方面收获满满。过去一个平台可以成就一个明星、一首歌曲,现在反过来,一首单曲竟然具有如此大的魔力,给平台带来助力。这一现象本质是,移动互联网进入内容时代,而《小幸运》的成功给内容产业还是带来了些许启发的。 内容究竟是什么鬼? 2015年可谓中国内容创业的大年,音乐、视频、广播、文学、动漫诸多数字内容领域都
罗超频道
2018/04/28
9330
序列化和反序列化的底层实现原理是什么?
(1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;
chengcheng222e
2021/11/04
4690
深入分析Java的序列化与反序列化
序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题:
哲洛不闹
2018/09/18
7460
深入分析Java的序列化与反序列化
Antd给表格一个斜线分隔(通过css改变)
代码: const [ columns, setColums ] = useState([ // 主要代码 title: <div style={{ "position": "relative" }}> <div style={{ "text-align": "right" }}>参数</div> <div style={{ "text-align": "
江一铭
2022/06/16
7990
Antd给表格一个斜线分隔(通过css改变)
当我谈论URL编码时我在谈论什么
今天收到一个 Bug, 一个超级奇怪的人名叫做 Isxxxxa Onxxxna Anton
szhshp
2022/08/15
2830

相似问题

为什么当我从函数中改变它时,the‘没有变化?

35

为什么当我把它变成负值时,这个值没有改变?

30

为什么当我通过Client发送<Active Source>消息时,我的输入源没有改变?

19

当我试图改变它时,反应状态并没有改变。

14

为什么当我通过一个函数调用axios时,它没有更新?

217
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文