问题标签 [objectinputstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
828 浏览

java - android/java:使用其他东西而不是 ObjectInputStream 来加载对象

我有一堆对象存储在几个文件中,我需要在我的应用程序开始时将它们加载到内存中,这就是我的做法:

问题是,当我尝试加载一个HashMap<Integer, int[]>大小超过 500k 的 object() 时,它会在我的手机上花费很长时间。我不确定这是否是 ObjectInputStream 的问题,如果是,是否还有其他更快的方法可以从文件中存储和检索对象?越快越好,非常感谢。

0 投票
3 回答
26927 浏览

java - Exception.getCause() 在尝试查找异常源时返回 null

为什么System.out.println(e.getCause());null?并且可以像这样存储整个 HashSet 集合吗?


用来printStackTrace()代替getCause()

仍然看不到问题,除了它捕捉到集合的第一个对象,并且集合正在实现Serializable,所有对象也实现Serializable并且线程在声明的地方有瞬态

0 投票
2 回答
2158 浏览

java - 在 Android 应用程序中 readObject 时出现 EOFException


我使用序列化将数据保存在我的 android 应用程序中。一切都很顺利,直到用户报告他无法打开他的文件。
在检查了他发送给我的文件后,发现问题是 readObject() 时出现 EOFException。

我在 vim 中打开了 .ser 文件,它不是空的。它看起来和其他可以正常打开的文件一样正常。
当用户保存 .ser 文件时,不出意外。

我的问题是:
1. 首先使用序列化是一个错误的决定吗?
2. 我的代码在大多数情况下都能正常工作,但我可能遗漏了一些最终导致此问题的内容。
3. 用户说这个文件对他来说非常重要,所以我真的很想找到一个解决方法来打开这个文件。

以下是如何读取文件的代码:

这是我用于保存可序列化的代码。

这是块定义的代码片段:

0 投票
3 回答
3185 浏览

java - (java) ObjectInputStream 反序列化错误版本的对象

我只是从一本 java 书中学习网络,所以我有点菜鸟。我在书上或网上都找不到这个问题,所以我决定上网问问。

书中说使用 ObjectOutputStream 和 ObjectInputStream 将对象发送和接收到不同的控制台。

现在,我能够成功接收我发送的对象——但只能接收一次。当我发送不同的对象:随机字符串和整数以及无名实例时,控制台具有所有正确的字段。但是当我发送一个对象的实例,更改一个实例字段的值,然后重新发送该对象时,inpustream 会加载原始实例的值。

因此,例如,我有一个公共 int“var”等于 1 的类的实例。如果我发送这个类的实例,客户端会收到它并正确报告 var = 1。但是,如果我改变var 到 2(在同一个实例中)并重新发送它,客户端将完成调用 read() 方法(所以它必须收到新对象!),但它会报告 var 为 1。如果我将实例发送到另一个尚未收到实例的客户端,它会正确地将 var 报告为 2,即使我更改 var 也会继续报告为 2。

如果客户端之前没有收到实例,它会读取正确版本的实例,这一事实必须意味着对象正在通过输出流正确发送;由于某种原因,输入流无法正常工作。几乎就像它看到它是同一个对象,所以它假定它具有相同的值而无需检查。为什么会发生这种情况,我该如何解决?

抱歉,如果我问的是愚蠢的问题——这本书没有解释序列化和套接字是如何工作的,只是解释了如何使用它们,所以我很可能对如何使用它们从根本上感到困惑。谢谢!

我为测试问题而编写的简单代码:

服务器:(有一个定时器动作来不断发送更新的对象)

客户

当这些程序运行时,Server 类的输出是 1,2,3,4... 无限增加,而 Client 类的输出只是 1,1,1,1,1,1,1 等。

感谢您抽出时间来阅读。对不起,如果我只是愚蠢,我对这个东西很陌生。

编辑:对不起, read() 是错误类型(我手动输入代码,因为我无法正确格式化),我的意思是 input.readObject()

0 投票
2 回答
1194 浏览

java - ObjectInputStream 的工作

我有多个对象存储在一个文件中。这是关于 ObjectInputStream 的。如果我有以下代码:

我的问题是:从第二个对象流(obj2)调用的 readObject 会是文件中的第一个还是第二个对象

0 投票
2 回答
1844 浏览

java - 具有多个客户端的 Java SocketServer - StreamCorruptException

应用程序

我正在用 Java 编写一个客户端/服务器应用程序,它通过使用 ObjectStream 类通过套接字发送对象来进行通信。应用程序中的每个节点大致如下所示:

这里server变量是本节点监听client的套接字,变量是其他节点监听的套接字,以及本节点发送对象的套接字。

我用来将对象写入其中一个客户端套接字的代码如下所示:

我用来处理连接和从节点的服务器套接字读取对象的代码如下所示:

问题

我想我在这里的插座做错了什么。当每台服务器只连接到一个客户端时,一切正常。但是,当多个客户端与同一个服务器通信时,事情变得很糟糕,我从 ObjectInputStream 和其他奇怪的行为中得到了 StreamCorruptedException(放入一个 UpdateRequest 消息的实例,并取出一个 Integer(0) 的实例和一些异常,例如。)

我的直觉告诉我,这两个对象/字节流以某种方式混合在一起,这在尝试反序列化对象时会产生奇怪的结果。我的问题是:为什么会发生这种情况,也就是我做错了什么,我该如何解决?

0 投票
2 回答
1474 浏览

java - Java ObjectInputStream 挂在第二个客户端实例上

找到解决方案(考虑这个关闭并回答,因为我无法在 7 小时之前回答我自己的问题)。我留下了一个不必要的套接字实例,它使客户端应用程序挂起。很抱歉为此打扰大家,并感谢您为帮助我四处寻找问题所付出的努力=)爱你们!

我正在寻找解决这个“问题”的方法。我有一个银行模拟应用程序,需要模拟银行多个分支机构之间的银行转账。我目前使用一个事件总线来调度客户端连接器对象捕获的不同事件对象。如果客户端侦听接收到的事件,它将调用命令对象并更新它需要更新的任何内容,依此类推(只是为了让您了解全局)。

现在,由于某种原因,我无法理解,我的第一个客户端实例可以正常打开,并且行为与预期一样,但是在第一个客户端实例之后打开的任何客户端实例都将挂在这些行中(变量在初始化之前声明):

没有抛出异常,没有什么......第二个,第三个,......启动的实例永远不会超过这些非常简单的行。如您所知,上面的代码是在客户端主函数实例化的 EventBusConnector(...) 对象中调用的。这是使用前面所述的命令对象的 ReadEventFromStream 类:

}

所以嗯……是的……我已经为此努力了好几个小时,我真的需要一些帮助,因为我对此感到抓狂。如果您需要更多代码,我会粘贴它。谢谢 =)

0 投票
3 回答
639 浏览

java - 这是一个好的做法 - 使用 EOF 异常来检测文件结束

我正在从 ObjectInputStream 读取数据,但我事先不知道对象的数量。因此,使用 EOF 异常捕获块来检测已到达文件的 END 并关闭文件。

  • 这是一个好的/安全的编程习惯吗?

  • 如果它不是一个好方法,可以以更好的方式完成吗?

0 投票
2 回答
1039 浏览

java - 使用 Java 流函数检查数据是否在流中的更好解决方案?

我有一个需要读取数百个套接字通信的应用程序。

我正在使用具有线程数上限的 ThreadPool 来服务这些套接字。如果套接字没有传入消息,这会导致所有线程阻塞。

我目前使用 100 毫秒的 soTimeout 来避免永久阻塞。我不喜欢这种方法,因为它可能会在它开始接收输入时超时。

还有其他方法可以解决这个问题吗?

我尝试使用 ObjectInputStream.isAvailable() 检查,但无论流中是否有数据,它总是返回 0。

我找不到任何其他方法来检查流中是否有数据。这将是理想的,因为那时我可以检查是否有数据,如果没有,则继续下一个流。

0 投票
2 回答
36774 浏览

java - Java - 使用 ObjectInputStream 监听套接字

好的,我有一个名为“客户端”的线程类,每次服务器接受连接时,它都会创建一个新客户端..运行方法侦听来自客户端的消息,我正在使用 ObjectInputStream ..

我遇到的问题是,为什么每次循环时我都必须创建一个新的 ObjectInputStream ......如果我在循环结束时关闭输入流并且它再次循环以获取另一条消息,我会收到一个错误......请有人帮忙