【问题标题】:Jackson: How to Detect Modified Object after Deserialization and Serialization?Jackson:如何检测反序列化和序列化后修改的对象?
【发布时间】:2018-04-13 08:41:54
【问题描述】:

我有一个对象,任何数据对象(例如,Person)都被序列化并带到用户界面。用户点击保存按钮,不管有没有变化。

在用户界面上检测对象已被用户更改的最佳方法是什么?请注意,对象可能有子记录,对这些记录的更改还应将“需要保存”属性设置为 true。

在构建我们自己的逻辑之前,有没有标准的方法来做到这一点?我们的客户端是 Angular 1.6,服务器站点是带有 RESTEASY 的 Java 1.8。但我想这对于任何使用序列化的平台来说都是一个常见问题。

【问题讨论】:

  • 这不是与 Angular 的表单/输入变化比杰克逊更相关吗?
  • @AlbertBos 不是真的。这个问题不仅是有角度的,而且我认为适用于任何将对象序列化和反序列化到 UI 的系统。您在哪里检测到变化?客户端站点。服务器站点?

标签: java rest jackson resteasy


【解决方案1】:

解决方案需要同时更改服务器和客户端站点:

  1. 如果您的 Entity 对象继承自一个对象,这将很有帮助。在我们的系统中,所有模型对象都继承自一个名为 JsonModelObject 的类。我们引入了一个布尔型 jsonDirty 字段,初始化为 false。因此,所有序列化的对象都会自动下降到角度前端,并将此标志设置为 false。

  2. 客户端站点:它还帮助您系统的所有 CRUD 操作调用常用方法。在我们的例子中,当从服务器站点接收到记录时,我们使用 JSON.stringify 并将其存储为字符串,例如:
    $scope.editRecordForChangeCheck = JSON.stringify($scope.editRecord);

  3. 保存时,我们检查表单的 $dirty 标志(如果有角度),并将保存的记录的 JSON.stringify 与初始的 $scope.editRecordForChangeCheck 进行比较。请注意,对于 angular,如果有以编程方式更改的字段,则 angular $dirty 标志不会设置为 true。

    var isDirty = $scope.form.$dirty || ($scope.editRecordForChangeCheck !== JSON.stringify($scope.editChildRecord)); if (isDirty) { $scope.editRecord.jsonDirty = true; // 这里你调用你的 api... }

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 2015-03-19
    • 2016-08-21
    • 2018-12-26
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2020-08-07
    相关资源
    最近更新 更多