首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无关系序列化模型

无关系序列化模型
EN

Stack Overflow用户
提问于 2016-12-23 15:15:12
回答 2查看 279关注 0票数 1

我有两个模特:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
class ModelA {
  ...
  @OneToMany(mappedBy = "modelA")
  @JsonManagedReference
  private List<ModelB> modelBs = new ArrayList<ModelB>();
  ...
}

@Entity
class ModelB {
  ...
  @ManyToOne
  @JoinColumn(name = "modela_id")
  @JsonBackReference
  private ModelA modela;
  ...
}

以及用于ModelA的REST/资源控制器,该控制器具有list方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping("list")
public @ResponseBody ArrayList<ModelA> list() {
  ArrayList<ModelA> modelas = new ArrayList();

  for (ModelA moa : modelARepository.findAll()) {
    modelas.add(moa);
  }

  return modelas;
}

现在,默认情况下,来自控制器的响应将包含一个ModelA对象的JSON数组,但这些对象也将包含ModelB。有没有一种方法可以选择您希望序列化的关系以及何时序列化?

来自Django/Laravel,我将使用专用序列化来解决这个问题,例如,我将有一个ModelAWithRelatiionsSerializer,其中我将序列化ModelA +所有它的关系,或者ModelAWithModelBSerializer,它将返回使用一个ModelB级别序列化的ModelA,等等。

我知道我可以使用juse忽略注释来不包含它,但这确实不一样,我没有看到任何关于Spring包中序列化的东西。做这件事的最佳或最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-25 10:49:18

对于来自Laravel(PHP)、Django(Python)、Rails(Ruby)的其他人来说:

我创建了一个包serializers,在这个包中,我为我的每个模型创建了一个序列化类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserSerializer {

  // Default user values
  public interface User {}

  // User values with users posts
  public interface UserWithPosts extends User {}  

}

现在,在您的模型中,您要做的是注释它们属于哪个序列化器的字段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity  
class User {

  @Id
  @GeneratedValue
  @JsonView(UserSerializer.User.class)
  private Long id;

  @JsonView(UserSerializer.User.class)
  private String username;

  @JsonView(UserSerializer.User.class)
  private String email;

  @OneToMany(mappedBy = "user")
  @JsonManagedReference  // This prevents infinite loop  
  @JsonView(UserSerializer.UserWithPosts.class)  
  private List<Post> posts;

  // .. getters and setters bellow
}

在您的控制器中,您要用@JsonView(..)注释您的方法,以说明您希望使用哪个序列化程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController  
@RequestMapping("users")  
public class UsersController {

  private UserRepository userRepository;

  public UserController(UserRepository userRepository) {
    this.userRepository = userRepository;
  }  

  /**
   * In list method we only want users default values to keep the payload smaller.
   */
  @GetMapping("list")
  @JsonView(UserSerializer.User.class)  
  public @ResponseBody ArrayList<User> list() {
    ArrayList<User> users = new ArrayList<>();

    for (User user : userRepository.findAll()) {
      users.add(user);
    }

    return users;
  }


  /**
   * In this method we are only fetching a single user so payload is smaller so we can add the users posts as well. You could also toggle this with a url filter/parameter.  
   */
  @GetMapping("show")
  @JsonView(UserSerializer.UserWithPosts.class)  
  public @ResponseBody ArrayList<User> show(@RequestParam(name = "id", required = true) Long id) {
    return userRepository.findOne(id):
  }

}  

Configuration!很容易理解,但是当我第一次这么做的时候,没有一个例子/教程告诉/显示您也需要更新配置。如果您不这样做,那么序列化您的关系就会有问题,但是序列化程序仍然可以工作,但是在您的JSON响应中会得到这样的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
"posts": [
  {},
  {},
  {},..
]
...

因此,它将为每个post用户返回一个JSON对象,但是没有值来修复我创建的config包,添加了一个WebConfiguration类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper mapper = Jackson2ObjectMapperBuilder.json().defaultViewInclusion(true).build();
        converters.add(new MappingJackson2HttpMessageConverter(mapper));
    }

}  

您也可以在XML配置中这样做。但我个人更喜欢使用基于Java类的配置。如果春天的文档能为新来的人提供更好的解释,那就太好了。

票数 0
EN

Stack Overflow用户

发布于 2022-01-17 23:14:11

拿一个没有那种关系的模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 $this->user = $user->withoutRelations();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41308838

复制
相关文章
模型类序列化器ModelSerializer
如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。
小闫同学啊
2019/07/18
6230
TensorFlow2.0(12):模型保存与序列化
模型训练好之后,我们就要想办法将其持久化保存下来,不然关机或者程序退出后模型就不复存在了。本文介绍两种持久化保存模型的方法:
统计学家
2019/12/30
1.8K0
一文梳理序列化推荐算法模型进展
| 作者:朱勇椿 | 单位:中国科学院大学 | 研究方向:跨域推荐、多任务学习
张小磊
2021/08/06
7520
Thrift 服务模型和序列化机制深入学习
http://www.liuqianfei.com/article/065b0f1ee59a4cf0b94a84c4e33af127
bear_fish
2018/09/19
1.3K0
Thrift 服务模型和序列化机制深入学习
【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )
JSON 格式比较简单的话 , 使用自带的 dart:convert 包 , 手动进行 JSON 的序列化与反序列化的操作即可 ;
韩曙亮
2023/03/29
2.7K0
【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )
Python序列化-序列化和反序列化
使用 JSON 模块将 Python 对象转换为 JSON 格式的字符串非常简单,只需调用 json.dumps() 函数并传递要序列化的 Python 对象即可。以下是示例代码:
玖叁叁
2023/04/18
7220
序列化和反序列化
一、序列化: 就是将内存中的对象转换为字节序列,方便持久化到磁盘或者网络传输 SerializeToString(): serializes the message and returns it as a string. Note that the bytes are binary, not text; we only use the str type as a convenient container. 二、反序列化: 就是将字节序列转换为内存中的对象 ParseFromString(data): p
Leophen
2019/09/23
9060
序列化与反序列化
序列化(pickling)   把变量从内存中变成可存储或传输的过程 反序列化(unpickling)   把变量内容从序列化的对象重新读到内存里的过程
py3study
2020/01/17
7410
序列化与反序列化
现今的后台服务大多是微服务架构,每个服务按照业务进行拆分,实现了服务之间的解耦,而服务之间要记性接口调用实现,服务支架要进行数据对象共享,就要把服务对象转成二进制流,通过网路传输,传送到对方服务,在把二进制流转成对象这就是是序列化,反序列化。
小土豆Yuki
2020/06/15
1.6K0
序列化系列(1)——JDK序列化和Hessian序列化
这么说太抽象了,举一个例子:你如果想让一个女孩子知道你喜欢她,你可以给她写情书,这样 「喜欢」 这种状态信息就变成了 「文字」 这种可以存储或传输的信息。
出其东门
2021/08/06
1K0
序列化和反序列化
序列化就是将Python对象(这里以python语言为例进行说明)及其所拥有的的层次结构转化为一个字节流的过程;而反序列化则是和序列化相反的操作,反序列化会将字节流转化为Python对象。
zy010101
2021/12/07
7760
序列化和反序列化
内存中的字典、列表、集合以及各种对象,如何保存到一个文件中? 如果是自己定义的类的实例,如何保存到一个文件中? 如何从文件中读取数据,并让它们在内存中再次变成自己对应的类的实例?
玖柒的小窝
2021/10/23
6760
序列化和反序列化
序列化:将对象写入到IO流中 反序列化:从IO流中恢复对象 在类中增加 writeObject 和 readObject 方法可以实现自定义序列化策略。 通过 ObjectOutputStream 和 ObjectInputStream 对对象进行序列化及反序列化。 意义:序列化机制允许将实现序列化的Java对象转换为字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。 使用场景:所有可在网络上传输的对象都必须是可序
红目香薰
2022/11/29
5300
【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )
在上一篇博客 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 ) 中 , 创建了 Protobuf 对象 , 本博客中将其序列化 , 保存到本地文件中 ;
韩曙亮
2023/03/29
2.2K0
Java 序列化与反序列化
1、什么是序列化?为什么要序列化?     Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程。     我们都知道,在进行浏览器访问的时候,我们看到的文本、图片、音频、视频等都是通过二进制序列进行传输的,那么如果我们需要将Java对象进行传输的时候,是不是也应该先将对象进行序列化?答案是肯定的,我们需要先将Java对象进行序列化,然后通过网络,IO进行传输,当到达目的地之后,再进行反序列化获取到我们想要的对象,最后完成通信。 2、如何实现序列化 2.1、使用
九灵
2018/03/09
1.3K0
对象序列化与反序列化
对象的序列化,反序列化 对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 序列化流(ObjectOutputStream),是过滤流—-writeObject 反序列化流(ObjectInputStream)—readObject 序列化接口(Serializable) 对象必须实现序列化接口 ,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17public static void
待你如初见
2018/08/01
8320
初探序列化与反序列化
在写程序尤其是写网站的时候,经常会构造类,并且有时候会将实例化的类作为变量进行传输。
偏有宸机
2020/11/04
8160
初探序列化与反序列化
Java序列化和反序列化
Java序列化(Serialize)是指将一个Java对象写入IO流中; Java反序列化(Deserialize)指的是从IO流中回复IO对象。
悠扬前奏
2019/05/28
8850
【Java】序列化与反序列化
对象序列化机制允许把内存中的Java对象转化成语平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。
CODER-V
2023/03/07
6410
点击加载更多

相似问题

Sqlalchemy1.4创建无关系字段的模型

14

主义无关系

13

YII中一页多模型无关系表

24

无关系ERD

21

关系加无关系

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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