Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java序列化对象与非序列化对象_Java_Serialization - Fatal编程技术网

Java序列化对象与非序列化对象

Java序列化对象与非序列化对象,java,serialization,Java,Serialization,1) 一个非序列化的java对象是否可以通过网络发送给另一个JVM执行,或者存储在本地文件存储器中以恢复数据? 2) 序列化和存储java对象与存储java对象而不序列化有什么区别?简而言之,您不在java中存储非序列化对象。所以我对这两个问题都说不 编辑:ObjectOutputStream和ObjectInputStream可以编写原语和可序列化对象(如果您正在使用的话) 1) 是否可以通过网络将非序列化java对象发送到 由另一个JVM执行或存储在本地文件存储中以获取 数据恢复 对象使用O

1) 一个非序列化的java对象是否可以通过网络发送给另一个JVM执行,或者存储在本地文件存储器中以恢复数据?
2) 序列化和存储java对象与存储java对象而不序列化有什么区别?

简而言之,您不在java中存储非序列化对象。所以我对这两个问题都说不

编辑:ObjectOutputStream和ObjectInputStream可以编写原语和可序列化对象(如果您正在使用的话)

1) 是否可以通过网络将非序列化java对象发送到 由另一个JVM执行或存储在本地文件存储中以获取 数据恢复


对象使用ObjectOutputStream进行编组,以便通过线路发送。序列化是存储对象状态的Java标准方法。你可以设计自己的方法来做同样的事情,但除非你以标准的方式看到一个大问题,否则重新发明轮子是没有意义的

2) 序列化和存储java之间的区别是什么 对象与存储java对象而不序列化它


序列化使用ObjectOutStream存储对象的状态,并可以使用ObjectInputStream反序列化。序列化对象可以保存到文件中,也可以通过网络发送。序列化是实现这一切的标准方法。但是如果你真的有必要的话,你总是可以发明方法来实现这一点。

序列化的目的是以一种自包含的方式存储对象的状态,而不需要原始内存引用、运行时状态等。换句话说,对象可以表示为可以存储在磁盘上的一串位,通过网络等发送。

序列化是一种将java对象表示为一系列字节的方法。这只是一种格式而已。 “内置”java序列化是一个类,它提供了一个API,用于将java对象转换为一系列字节。就这样。当然,反序列化是一个“补充”过程,允许将该二进制流转换回对象

序列化/反序列化本身与“通过网络发送”无关。发送一个二进制流非常方便,该二进制流可以通过序列化从对象创建

更重要的是,有时内置序列化不是获取二进制流的最佳方式,因为有时可以使用更少的字节来转换对象

因此,您可以使用自定义协议,为序列化提供自己的自定义(例如)

甚至使用第三方库,如

我认为这有效地回答了你的两个问题:

  • 如果需要,您可以自己将非序列化对象(我猜是没有实现“可序列化”接口的对象)转换为字节序列(字节流),然后通过网络发送,存储在二进制文件中。 当然,您必须了解如何读取此二进制格式以进行转换

  • 因为序列化只是一种转换协议,而不是“与存储相关的事情”,所以答案是显而易见的


  • 希望这有帮助。

    将对象存储在文件或数据库中或通过网络发送对象意味着序列化。也许不是Java的ObjectOutputStream品牌的序列化,但某种形式的序列化(XML、JSON、ORM、Protobuf等)要感谢Thio,更具体地说,只有实现可序列化接口的Java类才能通过网络发送吗?感谢Rogue。如果非序列化对象通过网络传输/存储在数据库中,java会引发异常吗?是什么阻止java存储未实现“可序列化”接口的对象?是的,您将进入目标VM。阻止不可序列化对象被序列化的原因是它没有序列化对象的方法,因此它不知道写什么。“序列化是存储对象状态的Java标准方式”。嗯,为了长期持久性,他们似乎提供了第二种基于XML的格式。@Thilo XML格式不是由Java定义的,而是由W3C定义的。Java当然支持通过JAXB等框架将对象转换为xml,反之亦然。“xml格式不是由Java定义的,而是由W3C定义的”。真正地java.beans.XMLEncoder在我看来像是JDK的一部分。这就像说“java语言是由Unicode联盟定义的”,因为我们使用UTF-8作为java源代码。@这不完全是因为java提供了符合不同规范的实现。java中有很多可用的协议实现API,这并不意味着java属于这些协议联盟。感谢Mark-crystal clear:)对象(未标记为可序列化接口的对象)如何存储在堆空间中?它也是二进制格式吗?难道不能使用堆空间中对象的表示将这些获取并按原样发送到另一个jvm或状态存储在DB中吗?对于标记为可序列化和不可序列化的对象,堆上的对象表示是否不同。很抱歉,如果这些问题必须是另一个线程的一部分,那么使用“new”/“by reflection”创建的对象将存储在堆中,而不考虑可序列化接口。对象实现Serializable的事实使得在内置序列化API(ObjectOutputStream)的帮助下将其转换为字节流,然后执行反序列化成为可能。这就是全部。一旦您将一个对象表示为一系列字节,您就可以使用这些字节执行任何操作—加载到db、存储在文件系统中、通过电子邮件向您的朋友发送—无论什么。但它与序列化无关。它的网络-一个不同的故事:)谢谢马克!堆中存储的对象的格式是什么?这个映像不能加载到另一个jvm的堆空间中并直接使用吗?我认为它是Java内部的,并且在jvm之间可能会有所不同。您可以获取转储并进行分析,但是