java - 保存正在使用的对象的“状态”,以供进一步比较(无序列化)
问题描述
GenericObject MyObj = new GenericObject();
MyObjs.add(); // operation 1
// operation for saving the current state of "MyObj"
MyObjs.add(); // operation 2 (it is the same as 1, repeated)
// Comparison with previous saved state of "MyObj" -> this will return **false**
MyObjs.remove(); // operation 3 (this operation cancel the effect of operation 2)
// Comparison with previous saved state of "MyObj" -> this will return **true**
我会保存一个对象的“状态”,当我以某种方式存储它的状态以及使用它来比较对象的未来状态之后,变量是如何变化的。
使用序列化,我可以在每次对象时序列化,而不是反序列化和比较,但我不能使用序列化。标准库怎么可能?
解决方案
您可以使用 Jackson-JSON 库以 json 格式转储对象的状态,而无需在类中实现序列化接口,然后通过读取该 json 数据并映射回对象类型来再次加载对象。
只需为此目的使用 ObjectMapper。
例子:
//do some stuff here with your MyObj object
ObjectMapper mapper = new ObjectMapper();
String jsonState1 = mapper.writeValueAsString(MyObj);
//do some stuff here
String jsonState2 = mapper.writeValueAsString(MyObj);
当你想比较它们中的任何一个时,你可以这样做:
GenericObject objState1 = mapper.readValue(jsonState1, GenericObject.class);
然后做任何你想做的比较。
希望有帮助!!
更新:
如果您只想使用标准 Java 库,那么您别无选择,只能使用 Java Reflection API。使用此 API,您可以访问类变量及其 getter 和 setter 方法,实际上是类拥有的所有内容。但不幸的是,您需要编写一大堆代码才能做到这一点。但如果您不想使用 Java 序列化,这是唯一的选择。
推荐阅读
- python - Python散点图与绘图
- java - 导入 org.apache.cxf 无法解析Java
- javascript - 使用 jQuery Datepicker 使日期在加载时无法选择
- python - pyqt5 设计器第二个窗口按钮不起作用
- r - 我在数据框的下标分配中不允许缺失值有错误
- azure - Azure:无法将存档 blob 从一个存储帐户复制到另一个?
- java - 如何调用字符串类型的方法?
- amazon-web-services - 无法使用 s3 bitbucket 在 ec2 中部署代码
- tfs - SpecFlow:关联自动化未在 Visual Studio 2017 中显示测试
- saxon - 处理 DITA 时在 Saxon-HE 9.9.1 中出现错误:DTD 上的 I/O 错误