【问题标题】:Java Serialization with JPA and Rest APIs使用 JPA 和 Rest API 进行 Java 序列化
【发布时间】:2019-11-28 03:52:27
【问题描述】:

正如我们所知道的Serialization在java中,引用博客here被使用

将对象的状态转换为字节流,可以是 持久化到磁盘/文件中或通过网络发送到任何其他正在运行的 Java 虚拟机。

  • REST API 案例:

现在考虑第二种情况,通过网络发送到另一个正在运行的 jvm,如果我们考虑一个 Rest API 的示例,即“host:port/path /资源”。

通常我使用 Spring 的 @RequestMapping 将资源模型 pojo 类返回为 ResponseEntity。我没有在模型类中实现Serializable接口,一切正常,我得到了json中API的响应。

ModelX.java

public class ModelX {

    private int x = 2 ;
    private String xs = "stringx";

    // getters and setters

}

控制器方法

@RequestMapping(value = "/test",method=RequestMethod.POST)
public ResponseEntity<ModelX> getTestModel(@RequestBody ModelX mox){

    ModelX mx = new ModelX();
    mx.setX(mox.getX());
    mx.setXs(mox.getXs());

    return new ResponseEntity<ModelX>(mx, HttpStatus.OK) ;
}

是不是因为 Spring 框架 使用那些 RestAPI 注释使其在后台可序列化?如果没有,如果不使其可序列化,我们如何能够通过网络发送。


  • 持久性案例:

只是为了更多的思考,即使在持久化数据库中的对象的情况下,我们使用来自JPA@Entity,现在我测试是否有任何@Entity注释类IS-A的实例@ @987654333 @ 与否。它给出了false

@Entity
class Car {

int id ;
String name ;

//getters and setters

}

测试方法 -

Car c = new Car();
System.out.println(c instanceof Serializable);

O/p - 错误

所以即使我们尝试将这个对象的状态保存在数据库中,ORM 也会在后台进行某种序列化?

【问题讨论】:

  • 对于 REST 部分,对象的状态不是转换为字节流,而是转换为 JSON 文本文档。对于 Hibernate/JPA 部分,请参阅此问题:stackoverflow.com/questions/2726300/…
  • @Arnaud 好吧,有道理。在现代应用程序中,我看到的主要使用的格式是 JSON,是否有任何特定的场景或应用程序(如果你知道的话)发送字节流更有益?
  • 如果数据要“发送到”/“由”另一个 JVM(它将使用 ObjectInputStream 将字节转换回 java 对象)“发送到”/“读取”,则将状态转换为字节流是相关的。
  • @Arnaud 我得到了,但我仍然可以使用 API 与另一个 jvm 对话,对吗?所以我在问字节流发送/读取是否有益的任何场景,因为在序列化的情况下,写入文件然后再次读取它仍然会有一点开销。如果我错了,请纠正我
  • 好吧,可能一件事是我们可以将状态保存到文件中,因此如果发送数据的应用出现故障,数据仍可用于其他 jvm。 (在 API 的情况下不会发生)

标签: java jpa serialization


【解决方案1】:

序列化是一个通用概念:

In computer science, in the context of data storage, serialization (or serialisation) is the process of translating data structures or object state into a format that can be stored (for example, in a file or memory buffer) or transmitted (for example, across a network connection link) and reconstructed later (possibly in a different computer environment).

Serializable用于序列化的单一具体实现,恰好内置在JVM中,称为“Java序列化”。但是转换为 JSON 或转换为数据库用于通信的任何协议也是序列化;他们只是与Serializable无关。

是否有任何特定的场景或应用程序(如果您知道的话)发送字节流更有益

一方面,二进制格式比 JSON 更小,并且可以更快地读取/写入。而且它们仍然可以是跨平台的。但为此,您通常会使用与 Java 序列化不同的二进制格式:例如Protocol BuffersThrift(或许多其他人)。

因此,如果发送数据的应用出现故障,其他 jvm 仍然可以使用数据。 (在 API 的情况下不会发生)

这也适用于 JSON(或上面的 PB 或 Thrift)。

【讨论】:

  • “这也适用于 JSON”,对,如果我们以 json 格式序列化。
  • 如果我没问题,这会是一个很好的例子吗,假设我有一个游戏,经过一些检查点/关卡后,我将文件中的进度存储/写入客户端文件系统。所以每当游戏崩溃甚至系统重启后,我总是从该文件中选择进度来恢复游戏
  • 序列化用例
  • 那么是的。特别是对于 Java 序列化,如果你想从旧版本的游戏中加载保存文件,它会变得更加复杂,所以你可能仍然想使用其他框架。
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多